assign语句中问号怎么用,assign语句是串行还是并行

  

  遍历:对于.在循环中:只遍历对象本身及其继承的可枚举属性。Object.keys():返回对象本身的所有可枚举属性的键名。JSON.stringify():只序列化对象本身的可枚举属性。Object.assign():忽略可枚举为false的属性,只复制对象本身的可枚举属性。前三个在ES5中可用,最后一个Object.assign()在ES6中是新的。其中,仅针对.在   

  

  会返回继承的属性,其他三个方法都会忽略继承的属性。   

  

  一般来说,在操作中引入继承属性会使问题复杂化。很多时候,我们只关心对象本身的属性。所以,尽量不要用for.但使用Object.keys()代替。   

  

  ES6有五种方法可以遍历对象的属性。(1)for...in   

  

  为.in循环遍历对象本身及其继承的可枚举属性(不包括Symbol属性)。   

  

  (2)Object.keys(obj)   

  

  Object.keys返回一个数组,包括对象本身(无继承)的所有可枚举属性(无符号属性)的键名。   

  

  (3)Object.getOwnPropertyNames(obj)   

  

  Object.getOwnPropertyNames返回一个数组,该数组包含对象本身所有属性的键名(不包括Symbol属性,但包括不可枚举的属性)。   

  

  (4)Object.getOwnPropertySymbols(obj)   

  

  Object.getOwnPropertySymbols返回一个数组,该数组包含对象本身的所有符号属性的键名。   

  

  (5)Reflect.ownKeys(obj)   

  

  Reflect.ownKeys返回一个数组,该数组包含对象本身的所有键名(不包括继承),而不管键名是符号还是字符串,也不管它们是否可枚举。   

  

  以上五种方法遍历对象的键名,都遵循相同的属性遍历顺序规则。   

  

  首先,遍历所有数字键,按升序排列。其次,遍历所有的字符串键,按照加入时间升序排列。最后遍历所有的符号键,按照加入时间升序排列。获取属性的描述对象对象。GetownPropertyDescriptor (obj,key)对象的每个属性都有一个描述符,用来控制属性的行为。object . getownpropertydescriptor方法可以获取该属性的描述对象。   

  

  let obj={ foo : 123 };object . getownpropertydescriptor(obj,' foo') //{ //value: 123,//writable: true,//enumeratable : true,//configurable: true //}描述对象的可枚举属性,称为“可枚举性”。如果该属性为false,则意味着某些操作将忽略当前属性。   

  

  另外,ES6规定所有类原型的方法都是不可枚举的。   

  

  我们知道,这个关键字总是指向函数所在的当前对象。ES6增加了另一个类似的关键字super,指向当前对象的原型对象。   

  

  const proto={ foo : ' hello ' };const obj={ foo: 'world ',find(){ return super . foo;} };Object.setPrototypeOf(obj,proto);Obj.find() //'hello '注意,当super关键字表示一个原型对象时,只能在该对象的方法中使用,用在别处会出错。   

  

  目前JavaScript引擎只能确认object方法的速记方法,定义了object的方法。   

  

  //错误const obj={foo: super.foo} //错误const obj={ foo 3360()=super . foo }//错误const obj={ foo 3360 function(){ return super . foo } }看下面的例子:   

  

  const proto={ x: 'hello ',foo() {   

    console.log(this.x);   }, }; const obj = {   x: 'world',   foo() {     super.foo();   } } Object.setPrototypeOf(obj, proto); obj.foo() // "world" 链判断运算符 可以理解为三元表达式的语法糖

  

要读取message.body.user.firstName,安全的写法是写成下面这样。

  

// 错误的写法 const  firstName = message.body.user.firstName; // 正确的写法 const firstName = (message   && message.body   && message.body.user   && message.body.user.firstName) || 'default'; 这样的层层判断非常麻烦,因此 ES2020 引入了“链判断运算符”(optional chaining operator)?.,简化了上面的写法。

  

const firstName = message?.body?.user?.firstName || 'default'; const fooValue = myForm.querySelector('input')?.value 上面的代码使用了?.运算符,直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。

  

也可用于函数:

  

if (myForm.checkValidity?.() === false) { // 表单校验失败   return; } 不可用于:

  

(a?.b).c // 等价于 (a == null ? undefined : a.b).c 上面代码中,?.对圆括号外部没有影响,不管a对象是否存在,圆括号后面的.c总是会执行。

  

一般来说,使用?.运算符的场合,不应该使用圆括号。

  

以下写法是禁止的,会报错。

  

// 构造函数 new a?.() new a?.b() // 链判断运算符的右侧有模板字符串 a?.`{b}` a?.b`{c}` // 链判断运算符的左侧是 super super?.() super?.foo // 链运算符用于赋值运算符左侧 a?.b = c 右侧不得为十进制数值

  

为了保证兼容以前的代码,允许foo?.3:0被解析成foo ? .3 : 0,因此规定如果?.后面紧跟一个十进制数字,那么?.不再被看成是一个完整的运算符,而会按照三元运算符进行处理,也就是说,那个小数点会归属于后面的十进制数字,形成一个小数。

  

Null 判断运算符读取对象属性的时候,如果某个属性的值是null或undefined,有时候需要为它们指定默认值。常见做法是通过||运算符指定默认值。

  

const headerText = response.settings.headerText || 'Hello, world!';const animationDuration = response.settings.animationDuration || 300; const showSplashScreen = response.settings.showSplashScreen || true; 上面的三行代码都通过||运算符指定默认值,但是这样写是错的。开发者的原意是,只要属性的值为null或undefined,默认值就会生效,但是属性的值如果为空字符串或false或0,默认值也会生效。

  

为了避免这种情况,ES2020 引入了一个新的 Null 判断运算符??。它的行为类似||,但是只有运算符左侧的值为null或undefined时,才会返回右侧的值。

  

const headerText = response.settings.headerText ?? 'Hello, world!'; const animationDuration = response.settings.animationDuration ?? 300; const showSplashScreen = response.settings.showSplashScreen ?? true; 优先级问题它与&&和||的优先级孰高孰低。现在的规则是,如果多个逻辑运算符一起使用,必须用括号表明优先级,否则会报错。

  

// 报错 lhs && middle ?? rhs lhs ?? middle && rhs lhs || middle ?? rhs lhs ?? middle || rhs (lhs && middle) ?? rhs; lhs && (middle ?? rhs); (lhs ?? middle) && rhs; lhs ?? (middle && rhs); (lhs || middle) ?? rhs; lhs || (middle ?? rhs); (lhs ?? middle) || rhs; lhs ?? (middle || rhs); 要注意代码的可读性额

相关文章