javascript null 判断_JavaScript 学习笔记

f26e2eed96148d2b06cc8e437ad848b1.png

一、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')

大白话:优先比较类型,同类型,比大小,非原始,调ToPrimitive,为对象调valueOf,还非原始调toString,最后还非原始则报错,如果为原始则进行类型对比,如果不同类型再转换,之后对比大小。

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

优先比类型,再比null与undefined,再比string和number,再比boolean与any,再比object与string、number、symbol;以上如果转为原始类型比较,则进行类型转换,直到类型相同再比较值的大小。这就是==的隐式转换对比,比较绕,给个图就清晰了!

如下为判断步骤

14d28c5c245f686c9ee8ce8afc40141a.png

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

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

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

如下为toString与valueOf转换

86bde0bb860c2f4a76dab28769a66507.png

对于===的判断

  • ===属于严格判断,直接判断两者类型是否相同,不同则返回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 判断的是右边的原型链

一个简单的类型验证函数

1d1f5c61d3c16c1441eb80a2af849ee4.png
作者:xiaofu0825
链接: https:// juejin.cn/post/69038003 49921017870
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值