1、数组初始化表达式

数组直接量中的列表逗号之间的元素可以省略,这时省略的空位会填充undefined。如:

 
 
 
2
2
 
 
 
 
 
1
var arr = [1,,,,,6]; 
2
console.log(arr[2]); //打印数组中索引为2的值->undefined
 
 
数组直接量的元素列表结尾处可以留下单个逗号,这时并不会创建一个新的值为undefined的元素。
2、运算符
(1)、javascript总是严格按照从左至右的顺序来计算表达式的。
如:

 
 
 
4
4
 
 
 
 
 
1
w = x + y * z; 
2
/*
3
首先计算表达式w,然后计算x,y,z,然后y的值与z的值相乘,再加上x的值,最后赋值给w所指代的变量或属性。
4
*/
 
 
(2)、所有数字都是浮点型,除法运算的结果也是浮点型。如5/2结果是2.5。
(3)、加号的转换规则优先考虑字符串的连接。(操作数中含有字符串时),但是
“++”或“--”运算符从不进行字符串的连接操作。
in运算符

用于检测某个属性名是否属于某个对象。

当属性名所对应的值初始化为undefined时,检测结果也为true;
当属性名被delete后,再次检测,结果为false。

 
 
 
7
7
 
 
 
 
 
1
var point = {    //定义一个对象
2
x: 1,
3
y: 1
4
};
5
console.log("x" in point); //true
6
console.log("z" in point); //false
7
console.log("toString" in point); //true:对象继承了toString()方法
 
 
instanceof运算符
用于检测某个对象是否是某个类的实例。所有的对象都是Object的实例。

 
 
 
4
4
 
 
 
 
 
1
var d = new Date(); //通过Date()构造函数实例化一个新的对象
2
console.log(d instanceof Date);    //true
3
console.log(d instanceof Object);     //true
4
console.log(d instanceof Number);    //false
 
 
3、逻辑表达式
(1)、逻辑与(&&)
原理:运算符首先计算左操作数的值,即“&&”左侧的表达式。如果计算结果是假值,那么整个表达式的结果也一定是假值,因此“&&”会返回左操作数的值,而并不会对右操作数进行计算,将左操作数的值作为整个表达式计算的结果。
反过来,左操作数的值为真值时,会计算右操作数的值,不管是真是假,都会返回右操作的值作为整个表达式计算的结果。

 
 
 
6
6
 
 
 
 
 
1
var o = {
2
x: 3
3
};
4
var p = null;
5
console.log(o && o.x);     //o和o.x都为真,返回o.x的值3
6
console.log(p && p.x);    //p为假值,返回p的值null,不去计算p.x
 
 
(2)、逻辑或(||)
原理:运算符首先计算左操作数的值,即“||”左侧的表达式。如果计算结果是真值,那么整个表达式的结果也一定是真值,因此“||”会返回左操作数的值,而并不会对右操作数进行计算,将左操作数的值作为整个表达式计算的结果。
反过来,左操作数的值为假值时,会计算右操作数的值,不管是真是假,都会返回右操作的值作为整个表达式计算的结果。
最常用的方式是从一组备选表达式中选出第一个真值表达式:

 
 
 
3
3
 
 
 
 
 
1
//如果max_width已经定义,直接使用它;否则在preferences对象中查找max_width
2
//如果没有定义它,则使用一个写死的常量
3
var max = max_width || preference.max_width || 500;
 
 
(3)、逻辑非(!)
对操作数的布尔值进行求反。
如:x是真值,则!x返回false。

 
 
 
3
3
 
 
 
 
 
1
// 对于p和q取任意值,这两个等式都永远成立
2
!(p && q) == !p || !q
3
!(p || q) == !p && !q
 
 
4、赋值表达式
在大多数情况下,表达式
a op= b (op代表一个运算符)
这个表达式和 a = a op b 是等价的。
特例:下面两个表达式不等价

 
 
 
15
15
 
 
 
 
 
1
var data = [1, 2, 3, 4];
2

3
for (var i = 0; i < 4; i++) {
4
    //根据表达式从左到右的运算顺序,++运算法则,先计算data[i]的值为1,i再加1
5
    //1*2 = 2,求得第一个值,i++,i为3,再次执行循环
6
    console.log(data[i++] *= 2); //2,6
7

8
}
9

10
for (var j = 0; j < data.length; j++) {
11
    //同上,先计算=左边的值后,j+1变为1,然后计算右边的表达式值,
12
    //此时j为1,data[j]=2,求得第一个值为4,然后j+1变为2,
13
    //j++,j为3,再次执行循环
14
    console.log(data[j++] = data[j++] * 2); //4 NaN
15
}
 
 
5、eval()
只有一个参数。如果传入的参数不是字符串,它直接返回这个参数。
作用:解析并运行由javascript源码组成的字符串。
如:

 
 
 
2
2
 
 
 
 
 
1
eval("3+2") // 5
2
eval("var y = 3");     //声明一个新的局部变量y
 
 
它使用了调用它的变量作用域环境。直接调用eval()时,它总是在调用它的上下文作用域内执行。其他的间接调用则使用全局对象作为其上下文作用域,并且无法读、写、定义局部变量和函数。如:

 
 
 
18
18
 
 
 
 
 
1
var geval = eval;    //使用别名调用eval将是全局eval
2
var x = "global",
3
    y = "global";
4

5
function f() {     //函数内执行的是局部的eval
6
    var x = "local";
7
    eval("x += 'change';");     // 直接eval更改局部变量的值
8
    return x;     //返回更改后的局部变量
9
}
10

11
function g() {     //函数内执行的是全局的eval
12
    var y = "local";
13
    geval("y += 'changed';"); //间接调用更改了全局变量的值
14
    return y;    //返回未更改的局部变量
15
}
16

17
console.log(f(), x);     // localchange global
18
console.log(g(), y);    // local globalchanged
 
 
在严格模式下,即es5 。代码段以 “ use strict ”开始,eval执行的代码段可以查询或更改局部变量,但不能在局部作用域中定义新的变量或函数。同时,eval被列为保留字,不能用一个别名覆盖eval()函数,并且变量名、函数名、函数参数或异常捕获的参数都不能取名为“eval”。
6、delete运算符
delete是一元操作符,它用来删除对象属性或数组元素。
如:

 
 
 
x

8
 
 
 
 
 
1
var o = { x : 1, y : 2};     //定义一个对象
2
delete o.x;                    //删除一个属性
3
"x" in o                    //false 属性不存在
4

5
var a = [1,2,3];            //定义一个数组
6
delete a[2];                //删除索引为2 的数组元素
7
2 in a;                    //false 索引为2的数组元素不存在
8
a.length                   // 3, 数组长度并没有改变,因为其它值的索引并没有改变
 
 
但是,一些内置核心和客户端属性是不能被删除的,通过var语句声明的变量也不能删除,function语句定义的函数和函数参数也不能删除。
在es5严格模式下,如果删除的操作数非法,将抛出一个语法错误的异常,同时删除不可配置属性时会抛出类型错误异常。在非严格模式下,只是简单的返回false,并不会报错。

 
 
 
9
 
 
 
 
 
1
var o = { x:1, y:2};  
2
delete o.x;    //true  
3
typeof o.x;    //undefined 属性不存在  
4
delete o.x;     //true 不存在属性  
5
delete o;    //false var声明不能删除  
6
  
7
delete 1;    //true 不是左值(属性)  
8
this.x = 1;    //全局定义一个属性  
9
delete x;     //true(非严格模式下) 严格模式下使用 delete this.x
 
 
 

span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }.cm-searching {background: #ffa; background: rgba(255, 255, 0, .4);}.cm-force-border { padding-right: .1px; }@media print { .CodeMirror div.CodeMirror-cursors {visibility: hidden;}}.cm-tab-wrap-hack:after { content: ""; }span.CodeMirror-selectedtext { background: none; }.CodeMirror-activeline-background, .CodeMirror-selected {transition: visibility 0ms 100ms;}.CodeMirror-blur .CodeMirror-activeline-background, .CodeMirror-blur .CodeMirror-selected {visibility:hidden;}.CodeMirror-blur .CodeMirror-matchingbracket {color:inherit !important;outline:none !important;text-decoration:none !important;}.CodeMirror-sizer {min-height:auto !important;}
-->
span::selection, .cm-s-monokai .CodeMirror-line > span > span::selection { background: rgba(73, 72, 62, .99); }.cm-s-monokai .CodeMirror-line::-moz-selection, .cm-s-monokai .CodeMirror-line > span::-moz-selection, .cm-s-monokai .CodeMirror-line > span > span::-moz-selection { background: rgba(73, 72, 62, .99); }.cm-s-monokai .CodeMirror-gutters { background: #272822; border-right: 0px; }.cm-s-monokai .CodeMirror-guttermarker { color: white; }.cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; }.cm-s-monokai .CodeMirror-linenumber { color: #d0d0d0; }.cm-s-monokai .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }.cm-s-monokai span.cm-comment { color: #75715e; }.cm-s-monokai span.cm-atom { color: #ae81ff; }.cm-s-monokai span.cm-number { color: #ae81ff; }.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute { color: #a6e22e; }.cm-s-monokai span.cm-keyword { color: #f92672; }.cm-s-monokai span.cm-builtin { color: #66d9ef; }.cm-s-monokai span.cm-string { color: #e6db74; }.cm-s-monokai span.cm-variable { color: #f8f8f2; }.cm-s-monokai span.cm-variable-2 { color: #9effff; }.cm-s-monokai span.cm-variable-3 { color: #66d9ef; }.cm-s-monokai span.cm-def { color: #fd971f; }.cm-s-monokai span.cm-bracket { color: #f8f8f2; }.cm-s-monokai span.cm-tag { color: #f92672; }.cm-s-monokai span.cm-header { color: #ae81ff; }.cm-s-monokai span.cm-link { color: #ae81ff; }.cm-s-monokai span.cm-error { background: #f92672; color: #f8f8f0; }.cm-s-monokai .CodeMirror-activeline-background { background: #373831; }.cm-s-monokai .CodeMirror-matchingbracket {text-decoration: underline; color: white !important;}
-->
li {list-style-type:decimal;}.wiz-editor-body ol.wiz-list-level2 > li {list-style-type:lower-latin;}.wiz-editor-body ol.wiz-list-level3 > li {list-style-type:lower-roman;}.wiz-editor-body blockquote {padding: 0 12px;}.wiz-editor-body blockquote > :first-child {margin-top:0;}.wiz-editor-body blockquote > :last-child {margin-bottom:0;}.wiz-editor-body img {border:0;max-width:100%;height:auto !important;margin:2px 0;}.wiz-editor-body table {border-collapse:collapse;border:1px solid #bbbbbb;}.wiz-editor-body td,.wiz-editor-body th {padding:4px 8px;border-collapse:collapse;border:1px solid #bbbbbb;min-height:28px;word-break:break-word;box-sizing: border-box;}.wiz-hide {display:none !important;}
-->

js权威指南学习笔记(二)表达式与运算符的更多相关文章

  1. Hadoop权威指南学习笔记二

    MapReduce简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.n ...

  2. netty权威指南学习笔记二——netty入门应用

    经过了前面的NIO基础知识准备,我们已经对NIO有了较大了解,现在就进入netty的实际应用中来看看吧.重点体会整个过程. 按照权威指南写程序的过程中,发现一些问题:当我们在定义handler继承Ch ...

  3. js权威指南---学习笔记02

    1.JS只有函数作用域,没有块级作用域这个概念: 它有一个特性——声明提前:在同一个函数中不同位置声明的变量,都被提前在函数开始的时候,执行声明操作:在原先位置执行赋值操作: 2.声明的全局变量,相当 ...

  4. js权威指南学习笔记(四)对象

    1.创建对象 (1).通过对象直接量的方式创建 说明:对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来. 如:       5 5   ...

  5. js权威指南学习笔记(三)语句

    1.声明语句 如果用var声明的变量没有初始化,那么这个变量的值会被初始化为undefined. 函数声明语句的语法如下:       4 4           1 console.log(func ...

  6. js权威指南学习笔记(一)类型、值和变量

    1.数据类型:原始类型(primitive type) 和对象类型(object type) 原始类型包括数字.字符串和布尔值: 除数字.字符串.布尔值.null(空).undefined(未定义), ...

  7. js权威指南---学习笔记01

    1.当函数赋值给对象的属性时,就变为了方法:2.被零整除不报错,只会返回无穷大(Infinity)或者负无穷大.例外:零除以零等于非数字(NaN).3.NaN与任何值都不相等! 4.Javascrip ...

  8. IDA Pro 权威指南学习笔记(二) - IDA 数据库文件

    生成数据库文件 把要分析的文件用 IDA 打开后,会生成 3 个数据库文件 扩展名分别为 .id0,id1,nam .id0 文件是一个二叉树形式的数据库 .id1 文件包含描述每个程序字节的标记 . ...

  9. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

随机推荐

  1. P3952 时间复杂度

    P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机 ...

  2. 为什么我会选择走 Java 这条路?

    阅读本文大概需要 2.8 分钟.   作者:黄小斜 文章来源:微信公众号[程序员江湖] 最近有一些小伙伴问我,为什么当初选择走Java这条路,为什么不做C++.前端之类的方向呢,另外还有一些声音:研究 ...

  3. mocha测试框架

    中文翻译文档:https://www.jianshu.com/p/9c78548caffa 阮一峰:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tut ...

  4. HihoCoder - 1513 bitset处理五维偏序

    题意:给出\(n<3e4\)个有序组\((a,b,c,d,e)\),求对第\(i\)个有序组有多少个\(j\)满足\((a_j<a_i,b_j<b_i,c_j<c_i,d_j& ...

  5. 【Python】端口扫描脚本

    0x00   使用模块简介 1.optparse模块 选项分析器,可用来生成脚本使用说明文档,基本使用如下: import optparse #程序使用说明 usage="%prog -H ...

  6. vue项目element-ui框架中的弹窗中的表单验证清除问题

    问题回顾: 1.vue项目的在弹窗上的form表单验证,第一次点击新增时正常,第二次新增打开弹窗后由于表单内容为空,出现验证这种情况 2.为了解决上面的情况,在执行点击新增事件加上this.$refs ...

  7. 前端cookie、localStorage、sessionStorage缓存技术总结

    转载自:https://www.cnblogs.com/belove8013/p/8134067.html 1.Cookie JavaScript是运行在客户端的脚本,因此一般是不能够设置Sessio ...

  8. Hibernate的抓取策略(优化)

    延迟加载的概述 什么是延迟加载 延迟加载:lazy(懒加载).执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询. 延迟加载的分类 l  类级别的延 ...

  9. orcale 之函数

    我们知道存储过程的调用是一条 PL/SQL 语句.那么对于一些表达式我们用什么呢?这里函数的功能就会体现出来了. 函数和过程在创建方式上有很多的类似地方,也是编译后放入内存中以供用户使用,只不过函数调 ...

  10. 有向图和无向图的数组C++实现

    源码:https://github.com/cjy513203427/C_Program_Base/tree/master/55.%E5%9B%BE 结点类Noded.h 不需要存储索引 #pragm ...