最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript 学习笔记

    正文概述 掘金(xiaofu0825)   2020-12-08   426

    一、JavaScript是什么

    JavaScript是主要用于客户端的脚本语言,ECMAScript是他的标准。

    ECMAScript尽管非常重要,但并不是 JavaScript唯一的部分,而且也不是唯一成为标

    准的部分。

    JavaScript包括了3个部分:

    · 核心部分:ECMAScript(里面定义了脚本语言所有的属性,方法和对象!JavaScript,

    JScript,ActionScript等都是它的一个实现)

    · 文档对象模型:DOM(貌似是操作 XML,HTML所必需的,把标记当成一颗树来操作,

    不是 JavaScript特有的)

    · 浏览器对象模型:BOM(处理浏览器窗口和框架的,一般的 JavaScript扩展也当作

    其中的一部分) 

    二、变量类型

    ==与===

    对于==的判断

    • 并不是那么严谨的判断左右两端是否相等
    • 它会优先对比数据的类型是否一致
    • 不一致则进行隐式转换,一致则判断值的大小,得出结果
    • 继续判断两个类型是否为null与undefined,如果是则返回true
    • 接着判断是否为string与number,如果是把string转换为number再对比大小
    • 判断其中一方是否为boolean,如果是就转为number再进一步判断
    • 判断一方是否为object,另一方为string、number、symbol,如果是则把object转为原始类型再判断

    比较情况

    1. 数组 == 值,(值类型指的是原始类型)会先转成数值再比较,与字符串比较会先转成字符串再比较

    2. 引用 == 值,会把引用类型转成原始类型再比较

    3. 值 == 值,直接比较类型再比较值的大小

    4. 字符串 == 数字,则把字符串转为数值再比较

    5. 其他类型 == boolean,则把boolean转成数值再进一步比较

    6. undefined == null,也会发生隐式转换,且2者可以相互转换,即2者相等,与自身也相等

    7. 对象 == 非对象,如果非对象为string或number,则返回ToPrimitive(对象) == 非对象,的结果;ToPrimitive方法的参数如果是原始类型则直接返回;如果是对象,则调用valueOf方法,如果是原始值再进行原始类型转换和大小对比;如果不是原始值则调用toString,且结果为原始值则进行原始类型比较,如果不是原始值则抛出错误

      // 以下结果都为true console.log([5]==5,['5']==5) console.log({name:'5'}=='[object Object]') console.log('5'==5,true==1,false==0) console.log(undefined==null) console.log([5,6]=='5,6',['5','6']=='5,6')

    所谓==比较就是要转换成同类型比较,如果无法转成同类型就报错

    如下为判断步骤

    JavaScript 学习笔记

    思考?如何判断此表达式(注意==!与!==) []==![]

    • 基于运算符的优先级此式会先运算![]的结果
    • !优先于==,且[]为真值(转成boolean,结果为true的就为真值,包括{};转成false的就为假值),![]结果为false,所以当前表达式转化为 []==false
    • 通过之前总结的转换关系,任何类型与boolean类型比较,所以[]==false 转化为 []==0 比较
    • 此时变为object与0比较,调用object的转换成原始类型的方法valueOf其结果还是valueOf
    • 再调用toString结果为'',再进行string转成number,则[]转成数字类型0
    • 表达式进一步转换成0==0,结果为true。

    虽然过程复杂,记住判断的思路即可,非对象之间,先类型转换再比大小,对象比较则调用获取原始值方法再进一步比较。

    如下为toString与valueOf转换

    JavaScript 学习笔记

    对于===的判断

    • ===属于严格判断,直接判断两者类型是否相同,不同则返回false

    • 如果相同再比较大小,不会进行任何隐式转换

    • 对于引用类型来说,比较的都是引用内存地址,所以===这种方式的比较,除非两者存储的内存地址相同才相等,反之false

      const a=[] const b=a a===b //true

      const a=[] const b=[] a===b //false

    7大原始类型与Object类型

    1. Boolean
    2. Null
    3. Undefined
    4. Number
    5. BigInt
    6. String
    7. Symbol
    8. Object

    类型判断

    原始类型判断
    • 原始类型string、number、undefined、boolean、symbol、bigint都能通过typeof(返回字符串形式)直接判断类型,还有对象类型function也可判断
    • 除了null无法通过typeof(为object)直接判断类型(历史遗留),包括对象类型,typeof把null当作对象类型处理,所以typeof无法判断对象类型,typeof也能判断function
    非原始类型判断(以及null)

    判断数组

    • 使用Array.isArray()判断数组
    • 使用[] instanceof Array判断是否在Array的原型链上,即可判断是否为数组
    • [].constructor === Array通过其构造函数判断是否为数组
    • 也可使用Object.prototype.toString.call([])判断值是否为'[object Array]'来判断数组

    判断对象

    • Object.prototype.toString.call({})结果为'[object Object]'则为对象
    • {} instanceof Object判断是否在Object的原型链上,即可判断是否为对象
    • {}.constructor === Object通过其构造函数判断是否为对象

    判断函数

    • 使用func typeof function判断func是否为函数
    • 使用func instanceof Function判断func是否为函数
    • 通过func.constructor === Function判断是否为函数
    • 也可使用Object.prototype.toString.call(func)判断值是否为'[object Function]'来判断func

    判断null

    • 最简单的是通过null===null来判断是否为null
    • (!a && typeof (a) != 'undefined' && a != 0)判断a是否为null
    • Object.prototype.__proto__===a判断a是否为原始对象原型的原型即null

    判断是否为NaN

    • isNaN(any)直接调用此方法判断是否为非数值

    一些其他判断

    • Object.is(a,b)判断a与b是否完全相等,与===基本相同,不同点在于Object.is判断+0不等于-0NaN等于自身
    • 一些其他对象类型可以基于原型链判断和构造函数判断
    • prototypeObj.isPrototypeOf(object)判断object的原型是否为prototypeObj,不同于instanceof,此方法直接判断原型,而非instanceof 判断的是右边的原型链

    一个简单的类型验证函数

    function isWho(x) {
      // null
      if (x === null) return 'null'
      const primitive = ['number', 'string', 'undefined',
        'symbol', 'bigint', 'boolean', 'function'
      ]
      let type = typeof x
      //原始类型以及函数
      if (primitive.includes(type)) return type
      //对象类型
      if (Array.isArray(x)) return 'array'
      if (Object.prototype.toString.call(x) === '[object Object]') return 'object'
      if (x.hasOwnProperty('constructor')) return x.constructor.name
      const proto = Object.getPrototypeOf(x)
      if (proto) return proto.constructor.name
      // 无法判断
      return "can't get this type"
    }
    

    起源地下载网 » JavaScript 学习笔记

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元