岁月一半是生活的温暖,一半是世态的薄凉;人生一半是心底的笑容,一半是旅程的艰辛!
总结:
- ++(先加后用、先用后加),自增在C、JAVA、 Python 中的效率问题;
- 如果不知道类型是否一致,但是就是要求一定相等,那么使用 === 和 !==;
- 函数里面应该用 var 或 let 定义;不能直接定义
- 逗号运算符的 优先级 是最低的;
- instanceof 要求必须明确使用类型定义变量,就是对象必须是new关键字声明创建的。它可以用于继承关系的判断。
1. 运算符
双目运算符 优先级高于 单目运算符;
算术运算符
+ - * / % 等运算符和Python一样
console.log(1/2) // 0.5自然除
console.log(1/0) // 无异常,返回无穷
console.log(5 % 3)
console.log(parseInt(1/2)) // 0
console.log(parseInt(3/2)) // 1
console.log(Math.floor(3/2)) // 1
console.log(Math.ceil(3/2)) // 2
console.log(Math.round(3/2)) // 2
console.log(Math.round(1/2)) // 1
++ 和 --
单目运算符,代表变量自增、自减
i++ 先用i,用完之后i再自增加1(先用后加)
++i i先自增,再使用i(先加后用)
let i = 0
let a = i++
console.log(a, i) // 0 1
console.log(a, i++) // 0 1
a = ++i // a=3
console.log(a, ++i) // 3 4
挑战题
i = 0;
let a = ++i+i+++i+++i;
console.log(a); // 答案是几?
比较运算符
注意: 隐式类型转换
>、<、>=、<= 没有什么区别
!=、==
!==、===(恒等,推荐使用)
== 宽松相等,进行类型转换,
=== 严格相等,不进行类型转换
console.log(100 > '200') // false
console.log(300 > '200') // true
console.log(300 > '2000') // false
console.log(3000 > '2a') // false
console.log('3000' > '2000') // true
// 宽松比较
console.log(300 == '300') // true
console.log('200' == '200') // true
// 严格比较 ===
console.log(300 === '300') // false
console.log('200' === '200') // true
从上面的比较中,我们起先以为前几行是隐式转换为字符串的,但是后来发现转换为数字,当3000>'2a'比较是犯难了;
使用宽松比较的时候,尽可能确保比较的类型相同,否则会引起隐式类型转换,而且隐式转换的规则很复杂不好把控,
如果不知道类型是否一致,但是就是要求一定相等,那么使用 === 和 !==;
建议比较的时候,一律使用 === 和 !==;
逻辑运算符
&&、||、! 与、或、非
这些运算符和其他高级语言都一样,支持短路;
位运算
& | ^ ~ << >> 位与、位或、异或、取反、左移、右移,和Python一样
三元运算符
条件表达式?真值:假值
等价于简单的if...else结构
if (条件表达式) {
真值
}
else {
假值
}
console.log(('3' > 30)?'真':'假')
逗号表达式
逗号(最低)的优先级 低于 = ;逗号表达式的 值 等于最后一次计算的值;
a = 100
b = 200
x = a, b, a>b ? a+b : b++
console.log(x,b) // 100 201
function add(){
return a+b, b; // 最后一次计算的值;
}
console.log(add()) // 201
其他
名称 | 说明 |
---|---|
instanceof | 判断是否属于指定类型,对象必须是new关键字声明创建的 |
typeof | 返回类型字符串 |
delete | delete 操作符,删除一个对象(an object)或一个对象的属性(an object's property)或者一个数组中的某一个键值,let、 var 定义的属性不能随便删除,隐式声明可以删除; |
in | 如果指定的属性在对象内,则返回true,索引(数字)是它的属性 |
console.log('a' instanceof String) // false
console.log(1 instance Number) // false
a = new String('b')
console.log(a instanceof String) // true
console.log(new Number(1) instanceof Number) // true
console.log(a instanceof Object) // true
console.log(typeof('a')) //string
console.log(typeof 'a') //string
console.log(typeof a) //object
instanceof 要求必须明确使用类型定义变量,就是对象必须是new关键字声明创建的。它可以用于继承关系的判断。
typeof 就是返回对象的类型字符串; 如果是 new String,就是object;
delete 删除对象、属性、数组元素;let、 var 定义的属性不能随便删除,隐式声明可以删除;
x = 42;
var y = 43;
let z = 60;
myobj = new Number();
myobj.h = 4; // create property h
console.log(delete x); // returns true (can delete if declared implicitly)
console.log(delete y); // returns false (cannot delete if declared with var)
console.log(delete z); // returns false
console.log(delete Math.PI); // returns false (cannot delete predefined properties)
console.log(delete myobj.h); // returns true (can delete user-defined properties)
console.log(delete myobj); // returns true (can delete if declared implicitly)
console.log('~~~~~~~~~~~~~~~~~~~~')
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
for (var i = 0; i < trees.length; i++)
console.log(trees[i])
console.log('==================')
delete trees[3]; // 数组中元素被删除,但空着的位置是undefined
for (var i = 0; i < trees.length; i++)
console.log(trees[i])
in 判断属性是否在对象内
注意:索引(数字)是它的属性
let trees = new Array("redwood", "bay", "cedar", "oak", "maple");
console.log(0 in trees); // true ,索引0
console.log(3 in trees); // true ,索引3
console.log(6 in trees); // false ,索引6
console.log("bay" in trees); // returns false ,bay 是值 ,不是属性;
console.log("length" in trees); // returns true ,0在数组对象的index中
delete trees[3];
console.log(3 in trees); // false
### 判断属性
// Custom objects
let mycar = {
color: "red",
year: 1998
};
console.log("color" in mycar); // returns true
console.log("model" in mycar); // returns false
console.log('year' in mycar) // true
运算符优先级
- 一元运算符里面的逻辑非优先级很高
- 逻辑与比逻辑或优先级高
逗号预算法优先级最低,比赋值语句还低。
记不住,就使用括号。
2. 表达式
基本表达式,和Python差不多
解析式也和Python的相似,但在ES6中非标准不推荐使用
生成器推荐使用生成器函数,ES6开始支持
function* inc() {
let i = 0;
let j = 7;
while (true) {
yield i++;
if (!j--) return 100;
}
}
let gen = inc()
for (let i = 0; i < 10; i++)
console.log(gen.next());
#--------------------------------------------------
{ value: 0, done: false }
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: 4, done: false }
{ value: 5, done: false }
{ value: 6, done: false }
{ value: 7, done: false }
{ value: 100, done: true }
{ value: undefined, done: true }
网友评论