美文网首页
52.4-运算符三目运算符逗号表达式生成器

52.4-运算符三目运算符逗号表达式生成器

作者: BeautifulSoulpy | 来源:发表于2020-05-15 11:25 被阅读0次

岁月一半是生活的温暖,一半是世态的薄凉;人生一半是心底的笑容,一半是旅程的艰辛!


总结:

  1. ++(先加后用、先用后加),自增在C、JAVA、 Python 中的效率问题;
  2. 如果不知道类型是否一致,但是就是要求一定相等,那么使用 === 和 !==;
  3. 函数里面应该用 var 或 let 定义;不能直接定义
  4. 逗号运算符的 优先级 是最低的;
  5. 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 }

相关文章

网友评论

      本文标题:52.4-运算符三目运算符逗号表达式生成器

      本文链接:https://www.haomeiwen.com/subject/nxugnhtx.html