当前位置: 首页 > Web前端 > HTML5

JavaScript小细节一览(一)

时间:2023-04-05 00:15:57 HTML5

属性访问表达式众所周知,JavaScript定义了两种属性访问的语法方法:表达式。identifierexpression(指定对象),identifier(指定需要访问的属性名)expression[expression]expression1(指定对象),expression2(指定要访问的属性名或数组的索引)被访问)varO={a:1,b:{c:3}}varA=[O,4,[5,6,7]]O.a//1O.b.c//3O["a"]//1A[1]//4A[0].b.c//3A[2]["2"]//7在第一种方法中,我们使用点。访问属性,第二种方法使用[]访问属性。其实如上,我们很容易发现两种方法的区别。第二种方法的方括号也是一个表达式。但是,这两种方法的第一个表达式是先计算的。如果计算结果为空或未定义,将抛出错误。如果计算结果不是对象或数组,JS会将其转换为对象(例如下面代码块的string)。varstr="HelloWorld!";varworld=s.substring(s.indexOf("")+1,s.length)如果运算结果不是对象或数组,JS会转为对象,有人会奇怪,字符串不是对象,为什么会有属性呢?这是因为当我们访问属性时,JS会调用newString(str)将字符串转换为对象,而新创建的提供该方法的对象自然会继承(可以参考对象继承的相关资料)String方法和用于处理属性引用。一旦属性引用结束,新创建的对象就会被销毁。当然,我这里只写了一个字符串的demo,数字布尔值类似于通过Number()Boolean()构造函数创建对象。回到属性访问表达式,如果表达式后跟.和标识符,标识符指定的属性值将被查找并作为整个表达式的值返回。如果对象表达式后面跟着一串[],就会计算[]中表达式的值,并转换为字符串。当然,如果访问的属性在这两个方法中不存在,就会返回undefine。我们可以看到,使用.+标识符更容易编写,我们有时更喜欢.当我们习惯于链式调用时。但是需要注意的是,在这种方式下,我们要访问的属性名必须是合法的。如果我们访问的属性名是一个保留字,或者是一个空格,或者是一个数字,或者是一个表达式计算出来的值,此时的属性访问必须使用方括号。delete运算符delete是一个一元运算符,我们可以用它来删除对象属性或数组元素。delete期望它的操作数是一个左值。如果我们误用它,使其操作数不是左值,则delete将不执行任何操作并返回true。当然,并不是所有的属性都可以删除。Uservar声明的变量、自定义函数、函数参数、内置核心属性等不能删除,非法删除会抛出错误。在这里插入并添加如下左值:所谓左值,简单来说就是一个可以赋值的表达式。在ES规范中,通过内部类型引用(Reference)来描述。它的作用是存储数据空间,允许存储。比如这里的属性访问表达式。delete操作符虽然可以删除对象的属性,但是我们要知道,delete实际上只是断开了属性与宿主对象的连接,并没有对属性中的属性进行操作。而且delete操作符只能删除自己的属性,不能删除继承的属性。a={b:{c:1}};d=a.b;deletea.b;console.log(d.c)//结果还是1,可以看出delete其实只是把属性从宿主对象上断开,不是它的破坏o={a:1};deleteo.a;//删除属性a并返回truedeleteo.x;//因为某个属性不存在,什么也不做,返回truedeleteo.toString;//因为继承了toString,什么都不做返回truedelete110;//没有意义,returntruedeleteObject.prototype;//返回falsevarb=1;deletethis.b;//returnfalsefunctionf(){};deletethis.f;//返回false逻辑运算符运算符示例说明逻辑与(&&)expr1&&expr2如果expr1可以转换为false,则返回expr1,否则返回expr2。因此,在布尔环境下使用时,当两个运算的结果都为真时返回真,否则返回假。逻辑或(||)expr1||expr2如果expr1可以转换为真,则返回expr1,否则返回expr2。因此,在boolean环境下使用时(if的条件判断中),两者的运算结果只要有一个为真,就返回真;当两个操作的结果都为false时,它??返回false。如果单个表达式可以转换为真,则逻辑非(!)!expr返回假,否则返回真。在JS计算逻辑中,我们在使用逻辑运算符时有一个短路原则。变量a=真;变量b=假;变种c=一个||1;//真值d=b||1;//1vare=a&&1;//1varf=b&&1;//false上面代码块中的变量c赋值时,a和1都为真,但是因为js的短路原理,逻辑or中只要第一个a为真,那么后面的1会直接忽略,第一个操作数如果为false,会计算后面的操作数。同样,在使用逻辑and时,只要第一个操作数为false,那么js会直接忽略后面的操作数,让运算结果直接为false。如果前一个操作数为真,则继续计算后面的操作数,最后如果后一个操作数为真,赋值给后一个操作数。变量a=真1||真2//真1varb=false||true3//true3varc=true4&&true5//true5vard=false&&true6//false待续~~~~