Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

判定和相等处处不同 #1

Open
huangchucai opened this issue May 11, 2017 · 0 comments
Open

判定和相等处处不同 #1

huangchucai opened this issue May 11, 2017 · 0 comments

Comments

@huangchucai
Copy link
Owner

判定和相等处处不同

原文链接

难为了老夫的英语啊!!!!

1. if判定

  1. 先来一个小试牛刀?

    这里有种感觉,我明明进来了,却还不能证明自己的身份

    if ([0]) {
        console.log([0] == true); //false
        console.log(!![0]); //true
    }
    // 虽然[0] 进入了if循环,但是[0] == true没有直接联系
    
    if ("potato") {
        console.log("potato" == false); //false
        console.log("potato" == true); //false
    }
    // 这里是不是很蒙蔽,明明已经进来了,但是不是true
  2. 解刨if语句

    我们知道js有6中数据类型:

    • number
    • string
    • boolean
    • undefined
    • null
    • Object

    参考我之前的一篇文章

    if判定也有6中默认为false的

    • false
    • '' [空字符串length属性为0]
    • undefined
    • NaN
    • null
    • 0
    数据类型 结果
    Undefined false
    null false
    Boolean 本身值
    Number false:  +0−0, or NaN
    String 空字符串(它的长度为0)
    Object true

2. 相等操作符(==)

**核心比较:**记住二个知识点,对于比较不严格的相等操作符

  1. undefinednull互相相等,和其余的不相等

  2. NaN和任何数据都不相等

  3. 所有的类型都转换成number进行比较

    Type(x) Type(y) 结果
    null Undefined true
    Undefined null true
    Number String x == toNumber(y)
    String Number toNumber(x) == y
    Boolean (any) toNumber(x) == y
    (any) Boolean x == toNumber(y)
    String or Number Object x == toPrimitive(y)
    Object String or Number toPrimitive(x) == y
    otherwise false
// 对象的valueOf比toString优先级高
var obj = {
    valueOf: function() {return 1},
    toString: function() {return "2"}
}
 
obj == "1"; //true
obj == "2"; //false

其他类型转换成数字的对比表

其他类型 ToNumber
Undefined NaN
Null +0
Boolean true => 1 false => 0
String “abc” -> NaN “123” -> 123
Object 调用toString()或者toValue()
//流程分析

[0] == true  //false
// 工作原理,进行转换
//1. [0].toString() =>   0
//2. true =>   1
//3. 0 不等于 1
//4. 返回false

"potato" == true; 
//1. 'potato' => NaN  //字符串装换成数字,
//2. true => 1
//3. NaN 不相等于任何字符
//4. 返回false


var crazyObj  = {
    toString: function() {return "2"}
}
crazyObj == 1;  //false
//1. 会调用对象的toString方法 得到2
//2. 2 不等于 1 
//3. 返回false
crazyObj == 2;  //true

// 对象的valueOf比toString优先级高
var obj = {
    valueOf: function() {return 1},
    toString: function() {return "2"}
}
obj == "1"; //true
obj == "2"; //false

3. 严格意义的相等

核心知识点

  1. 字符类型相等

  2. 值相等

  3. NaN null undefined 不等于任何其他类型的值(类型不相等) NaN不等于它本身

  4. 一般情况下都是用严格意义的相等

    // 在自己已经肯定了类型后,有时候不需要用严格意义的相等
    if(typeof fn === 'function')  // 不是必须
    if(typeof fn == 'function')  
    // 我们知道typeof返回的一定是一个字符串,所以类型肯定已经相等了,就不需要用严格相等  
     
// try
0 === false //false 类型不相等
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant