<script type="text/javascript"> 'use strict'; // 使用严格模式 var str = 'string'; // 必须使用var来声明变量 function Person(name, age) { this.name = name; this.age = age; } // Person(); // 禁止自定义的函数中的this指向window new Person('zh', 18); var str = '123'; eval('var str = "234"; alert(str)'); // 建立eval做用域不会污染全局变量 alert(str); // 对象不能有重名的属性 var obj = { name: '123', name: '234' } <script
var obj = { uername: 'zh', age: 18 }; var obj1 = Object.create(obj, { sex: { value: '女', writable: true, configurable: true, enumerable: true } })Object.defineProperties(object, descriptors)
var obj2 = { firstName: '123', lastName: '234' } Object.defineProperties(obj2, { fullName: { get: function () { // 惰性求值,获取扩展属性的值,获取扩展属性值的get方法自动调用 return this.firstName + ' '+ this.lastName; }, set: function (data) { // 监听扩展属性,当扩展属性发生变化的时候会自动调用,会将变化的值做为实参注入到set函数 console.log('Set()---' + data); var names = data.split(' '); this.firstName = names[0]; this.lastName = names[1]; } } }) obj2.firstName = '456' console.log(obj2.fullName); // 456 234 console.log(obj2); // {firstName: "456", lastName: "234"} obj2.fullName = 'change fullName' console.log(obj2.fullName); // change fullName
var obj = { firstName: '111', lastName: '222', get fullName() { return this.firstName + ' ' + this.lastName; }, set fullName(data) { var names = data.split(' '); this.firstName = names[0]; this.lastName = names[1]; } }; console.log(obj); obj.fullName = '333 444'; console.log(obj);
var arr = [1, 2, 3, 4, 5, 6, 7, 8]; var newArr = arr.map(function (item, index) { return item + 10; }) console.log(newArr); // [11, 12, 13, 14, 15, 16, 17, 18]
var arr = [1, 2, 3, 4, 5, 6, 7, 8]; var newArr1 = arr.filter((item, index) => item > 3 ) console.log(newArr1); // [4, 5, 6, 7, 8]
{ // console.log(sum); // 不会预处理(预解析),不存在变量提高 let sum = 123; // let sum = 123; // 不能重复声明 } // console.log(sum); // 在块级做用域内有效,在ES5及以前没有块级做用域
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01_let关键字</title> </head> <body> <button>测试1</button> <br> <button>测试2</button> <br> <button>测试3</button> <br> <script type="text/javascript"> let btns = document.getElementsByTagName('button'); // 闭包 // for (let i = 0; i < btns.length; i++) { // (function (i) { // btns[i].onclick = function () { // alert(i); // } // })(i) // } // 可代替闭包 for (let i = 0; i < btns.length; i++) { btns[i].onclick = function () { alert(i); } } </script> </body> </html>
// 解构数组 let arr = [1, 3, 5, 'abc', true]; let [, , a, b] = arr // 5 "abc"
// 对象的解构赋值 let { username, age, xxx } = obj; // 至关于 // let username = obj.username; // 因为let不能重复声明变量,故会在控制台中报错 // let age = obj.age; // let xxx = obj.xxx;
let obj = { userName: 'zh', age: 18 }; let str = '个人名字叫:' + obj.userName + ',个人年龄是' + obj.age; let tempalteStr = `个人名字叫:${obj.userName},个人年龄是${obj.age}`;
let username = 'zh'; let age = 18; let obj = { // 同名属性可省略不写 username, age, getName() { // 能够省略函数的function return this.username; } };
let obj2 = { name: '123', age: 18, text: () => { btn3.onclick = () => { console.log(this); // window console.log(this === window); // true } } } obj2.text();
function Point(x = 1 , y = 1) { this.x = x; this.y = y; }
function foo(a, ...value) { console.log(arguments); // 伪数组 Arguments(4) [1, 2, 3, 4, callee: (...)] console.log(value); // 数组 [2, 3, 4] } foo(1, 2, 3, 4);
var arr = [1,6] var arr1 = [2,3,4,5]; arr = [1,...arr1,6]; console.log(arr); // [1, 2, 3, 4, 5, 6] console.log(...arr); // 1 2 3 4 5 6
// 定义一我的物的类 class Person { constructor (name,age) { // 表示类的构造方法 this.name = name; this.age = age; } // 类的通常方法 showName() { console.log(this.name); } } let person = new Person ('000', 18); console.log(person); person.showName(); // 子类 class Child extends Person { constructor (name,age,salary) { super(name, age); // 调用父类的构造方法 this.salary = salary; } showName () { console.log(this.name, this.age, this.salary) } } let child = new Child('www', 18, 10000 ); console.log(child); child.showName();
let promise = new Promise((resolve, reject) => { //初始化promise状态为 pending //执行异步操做 if(异步操做成功) { resolve(value);//修改promise的状态为fullfilled } else { reject(errMsg);//修改promise的状态为rejected } })
promise.then(function( result => console.log(result), errorMsg => alert(errorMsg) ))
// 建立promiise对象 let promise = new Promise((resolve, reject) => { // 初始化promise状态:pending console.log(111); // 执行异步操做,一般是发送ajax请求,开启定时器 setTimeout(() => { console.log(333); // 根据异步任务的返回结果取修改promise的状态 // 异步任务执行成功 // resolve('成功标记'); // 修改promise的状态为 fullfilled:成功的状态 // 异步任务执行失败 reject('失败标记');// 修改promise的状态为 rejected:失败的状态 }, 2000) }) console.log(222); promise.then((data) => { // 成功的回调 console.log(data,'成功了') }, (error) => { // 失败的回调 console.log(error,'失败了')
let symbol = Symbol(); let obj = {}; obj[symbol] = 'hello';
let symbol = Symbol('one'); let symbol2 = Symbol('two'); console.log(symbol);// Symbol('one') console.log(symbol2);// Symbol('two')
// 建立symbol属性值 let symbol = Symbol(); console.log(symbol); let obj = {username: 'zh', age: 18}; obj[symbol] = 'symbol'; // 不能使用obj.symbol = '111' console.log(obj[symbol]); // for in, for of 不能遍历symbol属性 for (let i in obj) { console.log(i); } // 每建立一个symbol的值都须要经过 let symbol2 = Symbol('one'); let symbol3 = Symbol('two'); console.log(symbol2 == symbol3); // false console.log(symbol2, symbol3); // Symbol(one) Symbol(two) // 能够去定义常量 const Person_key = Symbol('person_key'); console.log(Person_key)
let targetData = { [Symbol.iterator]: function () { let nextIndex = 0; // 记录指针的位置 return { // 遍历器对象 next: () => { return nextIndex < this.length ? { value: this[nextIndex++], done: false } : { value: undefined, done: true }; } } } }
function* generatorExample(){ let result = yield 'hello'; // 状态值为hello yield 'generator'; // 状态值为generator }
// generator函数 function* myGenerator() { console.log('第一次执行'); let result = yield 'hello'; // 当调用第一次 MG.next() 时,指针停在此处 console.log('第二次执行'); console.log(result); // aaaaa yield 'generator' console.log('遍历完成') return "完成" } let MG = myGenerator(); // 返回一个遍历器对象/遍历器对象(Iterator) console.log(MG.next()); //done属性反映当前generator是否遍历完成,false表示没有遍历完 console.log(MG.next('aaaaa')); // next()调用的时候传参,传入的参数会做为next方法启动时候的返回值 console.log(MG.next()); //
async function foo(){ await 异步操做; await 异步操做; }
let arr2 = [1,2,3,4,5,6,7,8]; var result = arr2.find((item, index) => { return item > 4; }) console.log(result) // 5
let obj = {}; let obj1 = {username:"anverson", age: 42}; let obj2 = {sex: "女"}; Object.assign(obj, obj1); // 将源对象的属性复制到目标对象上 Object.assign(obj, obj2); console.log(obj); // {username: "anverson", age: 42, sex: "女"}
let obj2 = {};
obj2.__proto__ = obj1;
// 检测数据类型函数 function checkedType(target) { return Object.prototype.toString.call(target).slice(8, -1); } // 实现深度克隆 ---> 对象/数组 function clone(target) { let result, targetType = checkedType(target); if (targetType === 'Object') { result = {}; } else if (targetType === 'Array') { result = [] } else { return target; } // 遍历目标数据 for (i in target) { let value = target[i]; // 判断目标结构里的每一项值是否存在对象/数组 if (checkedType(value) === 'Object' || checkedType(value) === 'Array') { // 继续遍历获取到的value result[i] = clone(value); } else { result[i] = value; } } return result; }
// set let set = new Set([1, 3, 5, 5, 4, 8]); // 会将重复的5删除 console.log(set.size, set); set.add(7); console.log(set.size, set); console.log(set.has(8)); console.log(set.has(0)); set.clear(); console.log(set.size, set); // map let map = new Map([['aaa', 'username'], ['ccc', 'username']]); console.log(map.size, map); map.set('age', 111); console.log(map.size, map); map.delete('aaa'); console.log(map.size, map);
// 利用set给数组去重 function removeSame(arr) { let newArr = []; let set = new Set(arr); for (i of set) { newArr.push(i) } return newArr; }
console.log(3**3); // 3的3次幂 --- 9
let arr = [1,2,6,'abc']; console.log(arr.includes('a')); // false