赞
踩
此处为ES5新增语法
参考:https://www.runoob.com/js/js-strict.html
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
var
定义变量,而使用let
定义变量,const
定义常量let a = 1; // 使用let定义变量
a = 2; // 变量的值是可修改的
const b = 2; // 使用const 定义常量
b = 1; // 错误error,常量是不可修改的
const
定义变量时,必须初始化// 注意,在for循环中使用let定义变量,变量所在的作用域是循环体,因此在循环体外不能使用。 // 另外,for循环会对该变量做特殊处理,让每次循环使用的都是一个独立的循环变量,这可以解决JS由来已久的问题。 // 过去的问题 for(var i = 0; i < 3; i++){ setTimeout(function(){ console.log(i) },1000) } // 输出:3 3 3 //过去的解决办法:IIFE for(var i = 0; i < 3; i++){ (function(i){ setTimeout(function(){ console.log(i) },1000) })(i) } // 输出:0 1 2 //现在的做法 for(let i = 0; i < 3; i++){ setTimeout(function(){ console.log(i) },1000) } // 输出:0 1 2
2 ** 3 // 8
2 ** 4 // 16
String.prototype.includes(s)
=> 字符串中是否包含某个子串String.prototype.trim()
=> 去掉字符串首尾空白字符String.prototype.trimStart()
=> 去掉字符串开始的空白字符String.prototype.trimEnd()
=> 去掉字符串末尾的空白字符String.prototype.replaceAll(s, t)
=> 将字符串中所有的s替换为tString.prototype.startsWith(s)
=> 判断字符串是否以s开头String.prototype.endWith(s)
=> 判断字符串是否以s结尾`字符串内容`
const user = { name: 'monica', age: 17}
const s1 = `姓名:${user.name},年龄:${user.age}`
const s2 = '姓名:' + user.name +',年龄:' + user.age + '\nmy name is ' + user.name
// s1和s2 都是 姓名:monica,年龄:17
const user = { name: 'monica', age: 17}
const html = `
<div>
<p><span class="k">姓名</span><span class="v">${user.name}</span><p>
<p><span class="k">年龄</span><span class="v">${user.age}</span><p>
</div>
`
const arr = ['a', 'b', 'c'] // 过去的方式-垃圾 for(let i = 0; i < arr.length; i++){ const item = arr[i] console.log(item) } // for of 的方式,结果一样 for(const item of arr){ console.log(item) } const elements = document.querySelectorAll('.item'); //for of 的方式 for(const elem of elements){ // elem 为获取的每一个元素 }
Array.isArray(target)
=> 判断target是否为一个数组Array.from(source)
=> 将某个伪数组source转换为一个真数组返回Array.prototype.fill(n)
=> 将数组的某些项设置为nArray.prototype.forEach(fn)
=> 遍历数组,传入一个函数,每次遍历都会运行该函数Array.prototype.map(fn)
=> 数组映射,传入一个函数,映射数组中的每一项Array.prototype.filter(fn)
=> 数组筛选,传入一个函数,仅保留满足条件的项Array.prototype.reduce(fn)
=> 数组聚合,传入一个函数,对数组每一项按照该函数的返回聚合Array.prototype.some(fn)
=> 传入一个函数,判断数组中是否有至少一个通过该函数测试的项Array.prototype.every(fn)
=> 传入一个函数,判断数组中是否所有项都能通过该函数的测试Array.prototype.find(fn)
=> 传入一个函数,找到数组中第一个能通过该函数测试的项Array.prototype.includes(item)
=> 判断数组中是否存在item,判定规则使用的是Object.isconst name = 'xiaozhang', age = 22; const sayHello = function(){ console.log(`my name is ${this.name}`); } // 过去的方式 const user = { name: name, age: age, sayHello: sayHello } // 现在的方式:速写 const user = { name, age, sayHello } // 过去的方式 const MyMath = { sum: function(a, b){ //... }, random: function(min, max){ //... } } // 速写 const MyMath = { sum(a, b){ //... }, random(min, max){ //... } }
const arr = [4, 5, 8, 9, 0]; // 对数组的展开 Math.max(...arr); // 相当于 Math.max(4, 5, 8, 9, 0) const o1 = { a: 1, b: 2, } const o2 = { a: 3, c: 4, } // 对对象的展开 const o3 = { ...o1, ...o2 } /* o3: { a: 3, b: 2, c: 4 } */ const arr1 = [1, 2, 3]; const arr2 = [4, ...arr1, 5]; // [4, 1, 2, 3, 5]
const user = { name: 'xiaozhang', age: 22, addr: { province: '广东', city: '广州' } } // 取出 user 中的 name 和 age const { name, age } = user; console.log(name, age); // xiaozhang 22 // 取出 user 中的city const { addr: { city } } = user console.log(city); // 广州 const arr = [1, 2, 3, 4]; // 取出数组每一项的值,分别放到变量a, b, c, d 中 const [a, b, c, d] = arr; // 仅取出数组下标1、2的值 const [, a, , b] = arr; // 取出数组前两位的值,放到变量a和b中,剩下的值放到一个新数组arr2中 const [a, b, ...arr2] = arr; let a = 1, b =2; // 交换两个变量 [b, a] = [a, b] // 在参数位置对传入的对象进行解构 function method({ a, b }) { console.log(a, b); } const obj = { a: 1, b: 2, c: 3, }; method(obj); // 1 2 // 箭头函数也可以在参数位置进行解构 const method = ({a, b}) => { console.log(a, b) } const obj = { a: 1, b: 2, c: 3 } method(obj); // 1 2 const users = { {name:'xiaozhang', age: 22}, {name: 'xiaolai', age: 18} } // 在遍历时进行解构 for(const {name, age} of users){ console.log(name, age) }
const user = {
name: 'xiaozhang',
age: 22
}
{ // 属性 name 的描述符 name: { value: 'xiaozhang', configurable: true, // 该属性的描述符是否可以被重新定义 enumerable: true, // 该属性是否允许被遍历,会影响for-in循环 writable: true //该属性是否允许被修改 }, // 属性 age 的描述符 age: { value: 22, configurable: true, // 该属性的描述符是否可以被重新定义 enumerable: true, // 该属性是否允许被遍历,会影响for-in循环 writable: true //该属性是否允许被修改 }, }
Object.getOwnPropertyDesciptor(obj, propertyName)
=> 该方法用于获取一个属性的描述符const user = {
name: 'xiaozhang',
age: 22
}
Object.getOwnPropertyDescriptor(user, 'name');
/*
{
value: 'xiaozhang',
configurable: true, // 该属性的描述符是否可以被重新定义
enumerable: true, // 该属性是否允许被遍历,会影响for-in循环
writable: true //该属性是否允许被修改
}
*/
Object.defineProperty(obj, propertyName, descriptor)
=> 该方法用于定义某个属性的描述符const user = {
name: 'xiaozhang',
age: 22
};
Object.defineProperty(obj, 'name', {
value: 'xiaolai', // 将其值进行修改
enumerable: false, // 让该属性不能被遍历
writable: false // 让该属性无法被重新赋值
})
get
和set
,通过它们,可以把属性的取值和赋值变为方法调用const obj = {};
Object.defineProperty(obj, 'a', {
get(){ // 读取属性a时,得到的是该方法的返回值
return 1;
},
set(val){ // 设置属性a时,会把值传入val,调用该方法
console.log(val)
}
})
console.log(obj.a); // 输出:1
obj.a = 3; // 输出:3
console.log(obj.a); // 输出:1
Object.keys(obj)
=> 获取对象的属性名组成的数组Object.values(obj)
=> 获取对象的值组成的数组Object.entries(obj)
=> 获取对象属性名和属性值组成的数组Object.fromEntries(entries)
=> 将属性名和属性值的数组转换为对象const user = {
name: 'xiaozhang',
age: 22
}
Object.keys(user); // ["name", "age"]
Object.values(user); // ["xiaozhang", 22]
Object.entries(user); // [ ["name", "xiaozhang"], ["age", 22] ]
Object.fromEntries([ ["name", "xiaozhang"], ["age", 22] ]); // {name:'xiaozhang', age:22}
Object.freeze(obj)
可以冻结一个对象,该对象的所有属性均不可更改const obj = { a: 1, b: { c: 3, }, }; Object.freeze(obj); // 冻结对象obj obj.a = 2; // 不报错,代码无效 obj.k = 4; // 不报错,代码无效 delete obj.a; // 不报错,代码无效 obj.b = 5; // 不报错,代码无效 obj.b.c = 5; // b对象没有被冻结,有效 console.log(obj); // {a: 1, b: { c: 5 }}
Object.isFrozen
来判断一个对象是否被冻结Object.is
方法,可以判断两个值是否相同,它和===
的功能基本一致,区别在于Object.is(1, 2); // false
Object.is("1", 1); // false
Object.is(NaN, NaN); // true
Object.is(+0, -0); // false
// 数组去重:获取一个不包含重复项的新数组
const arr = [1, 4, 5, 6, 7, 8, 1, 2];
const newArr = [...new Set(arr)];
console.log(newArr); // [1, 4, 5, 6, 7, 8, 2]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。