const
之前的理解不对,正确如下
变量指向的内存地址所保存的数据不变,对于数值型字符串布尔值这些简单类型的数据,值就保存在变量指向的内存地址中,
但是对于复合型数据,变量指向的内存地址中保存的是指向实际数据的指针,所以指针是固定的,指向目标内的内存地址中的数据是可以改变的。
字符串新方法
includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
数值型新方法
Number.isFinite()用来检查一个数值是否为有限的(finite)。
如果参数类型不是数值,Number.isFinite
一律返回false
。
可以用来做数值型check。
Number.parseInt() Number.parseFloat()
ES6 将全局方法parseInt()
和parseFloat()
,移植到Number
对象上面,行为完全保持不变。
Number.isInteger()用来判断一个数值是否为整数。
Math.sign()
方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。
Math.sign('9') // +1
**ES2016 新增了一个指数运算符(**
)。
这个运算符的一个特点是右结合,而不是常见的左结合。多个指数运算符连用时,是从最右边开始计算的。
函数的扩展
结构配合函数的默认值。
function fetch(url, { body = '', method = 'GET', headers = {} } = {}) {
console.log(method);
}
fetch('http://example.com')
箭头函数不适用场景
第一个场合是定义对象的方法,且该方法内部包括this
。
const cat = {
lives: 9,
jumps: () => {
this.lives--;
}
}
上面代码中,cat.jumps()
方法是一个箭头函数,这是错误的。调用cat.jumps()
时,如果是普通函数,该方法内部的this
指向cat
;如果写成上面那样的箭头函数,使得this
指向全局对象,因此不会得到预期结果。这是因为对象不构成单独的作用域,导致jumps
箭头函数定义时的作用域就是全局作用域。
箭头函数没有自己的this而是引用外层的this。
第二个场合是需要动态this
的时候,也不应使用箭头函数。
var button = document.getElementById('press');
button.addEventListener('click', () => {
this.classList.toggle('on');
});
上面代码运行时,点击按钮会报错,因为button
的监听函数是一个箭头函数,导致里面的this
就是全局对象。如果改成普通函数,this
就会动态指向被点击的按钮对象。
另外,如果函数体很复杂,有许多行,或者函数内部有大量的读写操作,不单纯是为了计算值,这时也不应该使用箭头函数,而是要使用普通函数,这样可以提高代码可读性。
尾递归尾调用优化
数组的扩展
扩展运算符
赋值解构
function f(x, y, z) { // ... }
let args = [0, 1, 2, 3];
f(...args);
深拷贝数组
const a1 = [1, 2];
// 写法一
const a2 = [...a1];
// 写法二
const [...a2] = a1;
合并数组
const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
[...arr1, ...arr2, ...arr3]
字符串转数组
[...'hello']
// [ "h", "e", "l", "l", "o" ]
对象转数组 可以使用map等方法
let nodeList = document.querySelectorAll('div');
let array = [...nodeList];
Array.from
任何有length
属性的对象,都可以通过Array.from
方法转为数组,而此时扩展运算符就无法转换。
可以接受第二个参数,作用类似于数组的map
方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
Array.from([1, 2, 3], (x) => x * x)
copyWithin()
它接受三个参数。
- target(必需):从该位置开始替换数据。如果为负值,表示倒数。
- start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
- end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
这三个参数都应该是数值,如果不是,会自动转为数值。
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]