zoukankan      html  css  js  c++  java
  • 【JavaScript 从零开始】表达式和运算符(2)

    in运算符

    in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。

    如果右侧的对象拥有一个名为做操作数值的属性名,那么表达式返回true,例如:

    var point= {x:1 , y:1 };           //定义一个对象
    "x" in point                             //=>true: 对象有一个名为"x"的属性
    "z" in point                             //=>false: 对象不存在名为"z"的属性
    "toString" in point                   //=>true :对象继承了toString()方法
    
    
    var data= [7,8,9];                  //拥有三个元素的数组
    "0" in data                             //=>true: 数组包含元素"0"(数字零)
    1 in data                                //=>true: 数字转化为字符串
    3 in data                                //=>false:没有索引为3的元素

    eval()

    为什么要 eval这里要添加 “("("+data+")");//”呢?

    原因在于:eval本身的问题。

    由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

    加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,

    而不是作为语句(statement)来执行。

    举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:

    alert(eval("{}");                          // return undefined
    alert(eval("({})");                        // return object[Object]

    对于这种写法,在JS中,可以到处看到。

    如: (function()) {}();  做闭包操作时等。

    条件运算符(? :)

    条件运算符是JavaScript 中唯一的一个三元运算符(三个操作数),有时直接称作“三元运算符”。

    通常这个运算符写成 "? :" ,当然在代码中往往不会这么简写,因为这个运算符拥有三个操作数,

    第一个操作数在“?”之前,第二个操作手在 “?” 和 “:” 之间,第三个操作数在“:”之后。

    greeting= "hello "+ (username ? username : "there");
    //这和下面使用if语句的代码是等价的,但显然上面更加简洁:
    greeting ="hello ";
    if (username)
           greeting +=username;
    else
           greeting +="there";

    typeof运算符

    typeof是一元运算符,放在耽搁操作数的前面,操作手可以说任意类型,返回值为表示操作数类型的一个字符串。

    任意值在typeof运算符后的返回值

    x                             typeof x

    undefuned                "undefined"

    null                          "object"

    true或false                "boolean"

    任意数字或NaN            "number"

    任意字符串                 "string"

    任意函数                    "function"

    任意内置对象(非函数)  "object"

    typeof运算符可以带上圆括号,这让typeof 看起来像一个函数名,而不是运算符关键字 

    typeof(x) 

    delete 运算符

    delete是一个一元操作符,它用来删除对象属性或者数组元素。

    它是用来做删除操作的,并不是用来返回一个值得。例如:

    var o = {x: 1, y : 2};           //定义一个对象
    delete o.x;                            //删除一个属性
    "x"  in  o                               //=〉false : 这个属性在对象中不再存在
    
    
    var a = {1,2,3};                   //定义一个数组
    delete a[2];                           //删除最后一个数组元素
    2 in a                                    //=〉false :元素2在数组中已经不存在
    
    a.length                                //=〉3 :注意数组长度没有改变, 尽管a={1,2}

    还有一些需要注意的 ,不能删除通过var声明的变量

    例如:

    var o= {x:1 , y:2};   //定义一个变量,初始化为对象
    delete o.x;                 //删除一个对象属性,返回true
    typeof o.x;               //属性不存在,返回“undefined”    
    delete o.x;               //删除不存在的属性,返回true
    delete o;                  //不能删除通过var声明的变量,返回 false,严格模式下将抛出异常
    
    
    delete 1;                 //参数不是一个左值 返回 true
    this.x = 1;               //给全局对象顶一个属性,这里没有用 var 
    delete x;               //试图删除它,非严格模式下返回true ,严格模式下会抛出异常 ,使用“delete this.x ”代替
    x ;                        //运行时错误,没有定义x
  • 相关阅读:
    bzoj3771 Triple
    【BZOJ-1597】土地购买 DP + 斜率优化
    【BZOJ-1911】特别行动队 DP + 斜率优化
    【BZOJ-3144】切糕 最小割-最大流
    【BZOJ-2095】Bridge 最大流 + 混合图欧拉回路 + 二分
    【BZOJ-3996】线性代数 最小割-最大流
    【BZOJ-1497】最大获利 最大流
    【BZOJ-1500】维修数列 Splay
    【BZOJ-1458】士兵占领 最大流
    【BZOJ-3626】LCA 树链剖分
  • 原文地址:https://www.cnblogs.com/178mz/p/5307403.html
Copyright © 2011-2022 走看看