《深入理解ES6》学习笔记一 (前四章)

1. 块级作用域绑定

  • 使用var定义变量时,Javascript引擎预编译时会
    • 将变量声明移至程序顶部,具体的赋值操作在原声明处
    • 作用域外调用时值为 undefined
    • 循环输出时只输出引用(可能全部相同)
  • let定义变量,实现块级绑定(局部变量)
    • 循环中输出副本而非引用
  • const定义变量,定义局部常量
  • 小结:当前使用块级绑定最佳实践:
    • 默认使用const
    • 确实需要改变变量的值时使用let
    • 跨frame或跨window访问代码可用var

2. 字符串和正则表达式

  • 完全支持了Unicode
    • codePointAt()方法和String.fromCodePoint()方法,实现码位与字符之间相互转换
    • 正则表达式u,可直接操作码位
    • normalize()方法使我们能够更准确地比较多个字符串
  • 模板字面量 `
    • 简化创建,简化多行字符串
    • 变量之间嵌入: ${ }
  • 模板标签
    • 使用标签拼接数据和字面量

3. 函数

  • 默认参数值
	function makeRequest(url, timeout = 2000, callback = function(){}){
		//函数其余部分
	}
  • ES6中,如果一个函数使用了默认参数值,无论是否显式定义了严格模式
    • arguments的行为都将与ES5中严格模式下保持一致。
    • 即默认参数值的存在使得arguments对象保持与命名参数分离
    • 使用默认参数值,默认参数表达式皆可
  • 函数参数有自己的作用域和临时死区,其与函数体的作用域是各自独立的
    • 即是说参数的默认值不可访问函数体内声明的变量。
  • 不定参数
    • 在函数的命名参数前添加三个点(…)
    • 参数为一个数组,包含着之后传入的所有参数
    	function pick(object, ...keys){
    		let result = Object.create(null);
    		
    		for (let i = 0, len = key.length; i<len; i++){
    			result[keys[i]] = object[keys[i]];
    		}
    		
    		return result;
    	}
    
    • 可用以遍历对象中属性
    • 使用限制
      • 最多只能声明一个不定参数
      • 一定要放在所有参数末尾
  • 增强的Function构造函数
    • Function()构造函数:
      • 期待任意数目的字符串参数。
      • 最后一个参数是函数的函数体,它可以包含任意多条Javascript的语句,每条语句用分号分开。
    	//基本用法
    	var add = new Function("first", "second", "return first + second");
    	//默认参数用法
    	var add = new Function("first", "second = first", "return first + second");
    	//不定参数用法
    	var add = new Function("...args", "return args[0]");
    
  • 展开运算符
    • apply
      • Function.apply(obj,args)方法能接收两个参数
        • obj:这个对象将代替Function类里this对象
        • args:这个是数组,它将作为参数传给Function(args–>arguments)
        • 将数组默认转换为一个参数列表
    • call
      • Function.call(obj,[param1[,param2[,…[,paramN]]]])
        • obj:这个对象将代替Function类里this对象
        • params:这个是一个参数列表
        • 应用某一对象的一个方法,用另一个对象替换当前对象
    • 展开运算符
      • 简化使用数组给函数传参的过程
    • 示例:
    	let values = [25, 50, 75, 100]
    	//apply方式
    	console.log(Math.max.apply(Math, values))
    	//call方式
    	console.log(Math.max.call(Math, 25, 50, 75, 100))
    	//展开运算符方式
    	console.log(Math.max(...values))
    
  • name属性
    • 使用方法:Function.name
    • 用以协助调试用的额外信息
  • 元属性(Metaproperty)new.target
    • 元属性指非对象的属性
    • 判断函数是否通过new关键字调用,如:
    	if (typeof new.target !== "undefined")
    	if (typeof new.target === Person)
    
    • 在函数外使用new.target是一个语法错误
  • 块级函数
    • ES6中,使用严格模式时,块级函数将被提升至块的顶部,块外不能调用
    • 非严格模式下,函数将被提升至全局作用域,块外也可以访问。
  • 箭头函数
    • 基本语法示例
    	let reflect = value =>value;
    	let sum = (num1, num2) => num1 + num2;
    	let getName = () => "Nicholas";
    	let getTempItem = id => ({ id : id, name: "Temp" });
    	var result = values.sort((a, b) => a - b);
    
    • 与传统的JavaScript函数的不同
      • 没有this、super、arguments和new.target绑定
      • 不能通过new关键字调用
      • 没有原型
      • 不可以改变this的绑定
      • 不支持arguments对象
      • 不支持重复的命名参数
  • 使用尾调用优化
    • 尾调用不访问当前栈帧的变量
    • 在函数内部,尾调用是最后一条语句
    • 尾调用的结果作为函数值返回
    • 满足以上条件,引擎会自动对其进行优化
      • 保持一个更小的调用栈
      • 减少内存的使用
      • 避免栈溢出错误
    • 尾调用示例:
    	function dosomething(){
    		return doSomethingElse();
    	}
    

4. 扩展对象功能

  • 对象类别
    • 普通(Ordinary)对象:具有JavaScript对象所有的默认内部行为
    • 特异(Exotic)对象:具有默写与默认行为不符的内部行为
    • 标准(Standard)对象:ECMAScript 6规范中定义的对象,例如Array、Date等。标准对象既可以是普通对象,也可以是特异对象。
    • 内建对象:脚本开始执行时存在于JavaScript执行环境中的对象,所有标准对象都是内建对象。
      -对象字面量语法扩展
    • 属性初始值的简写
    	function createPerson(name, age){
    		return {
    			name: name,
    			age: age
    		};
    	}
    	//简写为
    	function createPerson(name, age){
    		return {
    			name,
    			age
    		};
    	}
    
    • 对象方法的简写语法
    	var person = {
    		name: "nicholas",
    		sayName: function(){
    			console.log(this.name);
    		}
    	}
    	//简写为
    	var person = {
    		name: "nicholas",
    		sayName() {
    			console.log(this.name);
    		}
    	}
    
    • 可计算属性名
    	var suffix = "name";
    	
    	var person = {
    		["first" + suffix]: "Nicholas",
    		["last" + suffix]: "zakas"
    	}
    
  • 新增方法
    • Object.is()方法:判断是否相等,比全等运算符(===)更准确
      • +0 === -0 返回true; Object.is()方法返回false
      • NaN === NaN 返回 false ; Object.is()方法返回true
    • Object.assign()方法:
      • 接受一个接收对象和任意数量的源对象
      • 按指定顺序将属性复制到接收对象中
      • 如果多个源对象具有同名属性,排位靠后的源对象会覆盖排位靠前的
  • 重复的对象字面量属性
    • 代码不再检查重复属性,对于每一组重复属性,都会选取最后一个取值
  • 自有属性枚举顺序
    • 规定对象的自有属性被枚举时的返回顺序
    • 基本规则:
      • 所有数字键按升序排序
      • 所有字符串键按照它们被加入对象的顺序排序
      • 所有Symbol键按照他们被加入对象的顺序排序
  • 增强对象原型
    • 改变对象的原型Object.setPrototypeOf()
      • 接收两个参数:
      • 被改变原型的对象及替代第一个参数原型的对象
      • 举例如下:
      	let friend = Object.create(person);
      	Object.setPrototypeOf(friend, dog);
      
    • 简化原型访问的Super引用
      • Super引用不是动态变化的,它总是指向正确的对象
      • 举例如下:
      	let friend = {
      		getGreeting(){
      			//之前调用方法
      			return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi";
      			//使用super后
      			return super.getGreeting() + ", hi!";
      		}
      	}
      
  • 正式的方法定义
    • 方法定义为:一个函数,它会有一个内部的[[HomeObject]]属性来容纳这个方法从属的对象
      		let person = {
      			//是方法
      			getGreeting(){
      				return  "Hello";
      			}
      		}
      		
      		//不是方法
      		function shareGreeting(){
      			return  "Hello";
      		}
      

猜你喜欢

转载自blog.csdn.net/weixin_43236610/article/details/82792354