JavaScript学习笔记(1):隐性转换、值与引用、for-in与for-of、数组
隐性转换
笔记
-
NaN != NaN
-
boolean
值在比较时会变为number
-
string
和number
比较时会变为number
-
null == undefined
,其余任何值与null
/undefined
比较都为false
-
原始类型与引用类型比较,会调用
toPrimitive
方法,具体做法就是先valueOf
后toString
-
我们在对各种非
Number
类型运用数学运算符(- * /
)时,会先将非Number
类型转换为Number
类型 -
加法特殊:
当一侧为
String
类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。当一侧为
String
类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。当一侧为
String
类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。该三点由上到下,优先级从高到低
1 | > {} + {} |
这个问题的原因是,JavaScript 把第一个 {}
解释成了一个空的代码块(code block)并忽略了它。NaN
其实是表达式+{}
计算的结果 (+ 加号以及第二个 {})。 你在这里看到的 +
加号并不是二元运算符「加法」,而是一个一元运算符,作用是将它后面的操作数转换成数字,和 Number()
函数完全一样。
- 转换表:
例题
1 | '1, 2, 3' == [1, 2, 3] |
true
1 | null == false |
false
1 | true == ['1'] |
true
1 | undefined == '' |
false
1 | '' == 0 |
true
值与引用
类型
- 值类型
数字,字符串,布尔,符号,未定义,空
- 引用类型
对象,函数,数组
引用类型
1 | let x = { value: 10}; |
控制台中:
1 | x |
对象不是存储在变量中,而是存储在内存中,变量保存的是对象的内存地址,因此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-of
中key
直接表示为数组内的一个元素。
该方法仅可用于可枚举的类型(数组和映射)。
可用于for-of 的Object方法
Object.key()
方法可获得输入对象的所有成员的键,并返回一个数组。
Object.entries()
方法可获得输入对象的所有成员的键值对,并返回一个数组。
克隆一个Object的方法
-
const newObject = Object.assign({}, oldObject);
最简单的方法,该方法相当于是将使用`...`拆分操作符将`oldObject`内的成员读取并拆解出填入`{ }`中。1
2
3
4
5
6
7
`{}`内不一定要为空,也可以为一个键值对,相当于是在`newObject`里新增一个键值对,然后再将`oldObject`中的成员克隆过来。
2. 拆分操作符法
```javascript
const newObject = { ...oldObject }; -
for-in法
1
2
3const 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
设定开始查找的位置。
一些实用技巧补充
${}
占位符用于一对反引号的模板语句中显示表达式或者变量。