隐性转换

笔记

  1. NaN != NaN

  2. boolean值在比较时会变为number

  3. stringnumber比较时会变为number

  4. null == undefined,其余任何值与null/undefined比较都为false

  5. 原始类型与引用类型比较,会调用toPrimitive方法,具体做法就是先valueOftoString

  6. 我们在对各种非Number类型运用数学运算符(- * /)时,会先将非Number类型转换为Number类型

  7. 加法特殊:

    当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。

    当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。

    当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。

    该三点由上到下,优先级从高到低

1
2
> {} + {}
NaN

这个问题的原因是,JavaScript 把第一个 {} 解释成了一个空的代码块(code block)并忽略了它。NaN其实是表达式+{}计算的结果 (+ 加号以及第二个 {})。 你在这里看到的 + 加号并不是二元运算符「加法」,而是一个一元运算符,作用是将它后面的操作数转换成数字,和 Number() 函数完全一样。

  1. 转换表:

20220112212233

例题

1
'1, 2, 3' == [1, 2, 3]

true

1
null == false

false

1
true == ['1']

true

1
undefined == ''

false

1
'' == 0

true

值与引用

类型

  1. 值类型

​ 数字,字符串,布尔,符号,未定义,空

  1. 引用类型

​ 对象,函数,数组

引用类型

1
2
3
let x = { value: 10};
let y = x;
x.value = 20;

控制台中:

1
2
3
4
x
>{value:20}
y
>{value:20}

对象不是存储在变量中,而是存储在内存中,变量保存的是对象的内存地址,因此y在复制x的时候,是复制x的内存地址,即x,y都指向同一内存地址,无论通过x还是y去修改这个对象的时候,修改的变化另外一个对象也能看到。

结论

值类型数据复制值

引用类型数据或对象复制引用(内存地址)

for-in与for-of

for-in

1
for(let key in object)

可以循环对象中的每一个成员,可以遍历一个数组,但最好使用for-of

in可以检查对象中是否包含给定的值

for-of

从ES6开始,更好遍历数组的方法。

1
for(let key of array)

for-ofkey直接表示为数组内的一个元素。

该方法仅可用于可枚举的类型(数组和映射)。

可用于for-of 的Object方法

Object.key()方法可获得输入对象的所有成员的键,并返回一个数组。

Object.entries()方法可获得输入对象的所有成员的键值对,并返回一个数组。

克隆一个Object的方法

  1. const newObject = Object.assign({}, oldObject);
    
    1
    2
    3
    4
    5
    6
    7

    `{}`内不一定要为空,也可以为一个键值对,相当于是在`newObject`里新增一个键值对,然后再将`oldObject`中的成员克隆过来。

    2. 拆分操作符法

    ```javascript
    const newObject = { ...oldObject };
    最简单的方法,该方法相当于是将使用`...`拆分操作符将`oldObject`内的成员读取并拆解出填入`{ }`中。
  2. for-in法

    1
    2
    3
    const newObject = {};
    for(let key in oldObject)
    newObject[key] = oldObject[key];

    最朴素的方法。

JavaScript部分内置对象

Math

Math参考文档

[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math]:

Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法。

注意:Math并不是一个函数对象

String

JavaScript中string分为两种,一种是值类型字符串,另外一种是String对象 。但在对值类型的字符串使用点操作符时,JavaScript会自动将值转换为对象,可以像操作对象一样操作它。

String参考文档

[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String]:

数组

添加元素

In End

1
numbers.push(anyThings);

anyThings可填入任意元素(不止一个元素)。

In Beginning

1
numbers.unshift(anyThings);

anyThings可填入任意元素(不止一个元素)。

In Middle

1
numbers.splice(startNumber, deleteCount, anyThings);

startNumber元素的位置。注意:数组从0开始计数。

deleteCount想要删除的元素的个数。

anyThings可填入任意元素(不止一个元素)。

查找元素

indexOF(查找值)

1
numbers.indexOF(anyThings, startNumber);

查找numbers内从startNumber开始(可选)是否存在anyThings元素,如果存在则返回所在位置,如果不存在则返回-1

注意:该方法是严格对应类型的,字符类型的'1'与数字类型的1是不同的。

类似的方法lastIndexOF,返回最后一个匹配的元素。

includes方法可以判断是否存在匹配元素,返回true or false

以上方法均可以加入第二参数startNumber设定开始查找的位置。

一些实用技巧补充

  1. ${}占位符用于一对反引号的模板语句中显示表达式或者变量。