从无到有的学习JavaScript——第二篇(运算符)

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

1. 数值型

在JS中,数据均为双精度浮点型,范围只能在-(2^{53} - 1)到2^{53} - 1之间,整型也不例外。数字类型还有三种符号值:+infinity(正无穷)、-infinuty(负无穷)和NaN(not-a-number非数字)。

常量属性:

var biggestNum = Number.MAX_VALUE;
var smallestNum = Number.MIN_VALUE;
var infiniteNum = Number.POSITIVE_INFINITY
var negInfiniteNum = Number.NEGATIVE_INFINITY;
var notANum = Number.NaN;

数字的方法:

内置数学对象Math: Math提供了绝对值、对数指数运算、三角函数运算、最大值、最小值、随机数、开方等运算函数,提供了PI值。

console.log(Math.PI)  // 3.141592653589793
console.log(Math.abs(-100))
console.log(Math.log2(16))  // 4
console.log(Math.sqrt(16))  // 4
console.log(Math.random())  // 默认为(0, 1)
console.log(Math.random(10, 100))  // 测试发现结果仍然是(0, 1)的随机数

2. 运算符

2.1 算术运算符

+ - * / %等运算符与python一样

console.log(1 / 2)  // 0.5自然除,没有向下取整
console.log(1 / 0)  // 无异常,返回无穷, Infinity
console.log(5 % 3)

console.log(parseInt(1 / 2))  // 0
console.log(parseInt(3 / 2))  // 1, 向下取整

// 下面三种与python中是一样的,round是四舍六入,五取偶
console.log(Math.floor( 3 / 2))
console.log(Math.ceil(3 / 2))
console.log(Math.round(3 / 2))
console.log(Math.round(1 / 2))

++ 和 --:

单目运算符,代表变量自增、自减,i++是先用i,用完之后再自增加1,++i是i先自增加1,在使用i(注意此时i已经加了1),下面是测试代码:


let i = 0
let a = i++
console.log(a, i)  // 0, 1
console.log(a, i++)  // 0, 1注意i++是先使用再自增,所以打印出1,但是i已经变成2了

a = ++i  // i已经是2了,在++i, a为3, i为3
console.log(a, ++i)  // 3, 4注意++i是先自增在使用

// 单目运算符优先级高于双目运算符
i = 0
let b = ++i + i++ + i++ + i
console.log(b)  // 7

2.2 比较运算符

>、<、>=、<=没有设么区别,!=、==,!==、===

== 宽松相等,进行类型转换, ==严格相等,不进行类型转换


console.log(100 > '200')  // flase
console.log(300 > '200')  // true
console.log(3000 > '2a')  // false,有疑问?

console.log('3000' > '2000')  // true

// 宽松比较
console.log(300 == '300') // true
console.log('200' == '200')

// 严格比较
console.log( 300 === '300')  // false
console.log('200' === '200')

从上面的比较中,我们发现比较的时候是隐式转换成数字的,使用宽松比较的时候,尽可能确保比较的类型相同,否则会引起隐式转换,而隐式转换的规则很复杂不好把控,如果不知道类型是否一致,但是就是要求一定要相等的,那么请你使用===和!==。

 

2.3 比较运算符

&&、||、! 与、或、非,这些运算符和其他高级语言一样,都支持短路。

2.4 位运算符

&、|、^、 ~、<<、>> 位与、位或、异或、取反、左移、右移,和python一样。

2.5 三元运算符

条件表达式?真值:假值 等价于简单的if ... else结构

if (条件表达式){

    表达式为真时执行的语句体
}
else{
    表达式为假时执行的语句体
}

2.6 逗号操作符

let n = 4 + 5, q = true, c = n > 10 ? '真' : '假'
console.log(n)
console.log(c)  // '假'

function test(){
    // return 2, n + q, c = n++
    return 5, c = n++, n + q  // 只能拿到最后的结果11
}

console.log(test())  // 9,只拿到了最后的值,现在还心存疑虑?让我们在测试一下
console.log(c)  // 9

2.7 其他


console.log('a' instanceof String)
console.log(10 instanceof(Number))  // 跟上面的写法不同,但是效果一样

w = new String('b')
console.log(w instanceof(String))  // true
console.log(new Number(20) instanceof Number)  // true
console.log(w instanceof Object)  // true, Object,其中Object是类型,所以O是大写字母

console.log(typeof 'w')
console.log(typeof('w'))
console.log(typeof(w))  // object,留意一下

instanceof 要求必须使用类型定义变量,就是对象必须是new关键字声明创建的,它可以用于继承关系的判断。typeof就是返回对象的类型字符串。

delete删除对象、属性、数组元素:

x = 42
var y = 43
let z = 60
myobj = new Number()

myobj.h = 4  // 创建了h属性
console.log(delete x)
console.log(delete y)
console.log(delete myobj.h)  // 可以删除用户自己定义的属性,不能删除系统内定义的属性,比如Math.PI
console.log(delete myobj)
console.log('==================')

var trees = new Array("reader", 'writer', 'apple', 'banana')
for(var i = 0; i < trees.length; i++)  // 注意i取不到trees.length
    console.log(trees[i])
console.log('==============')
delete trees[2]  // 注意数组中的元素被删除,但是空着的位置是undefined
for(var i = 0; i < trees.length; i++)
    console.log(trees[i])
/*
*==============
*reader
*writer
*undefined
*banana
*/

你能使用 delete 删除各种各样的隐式声明, 但是被var声明的除外

in 判断属性是否在对象内:

let people = new Array('Green', 'KD', 'Curry', 'Klay')
console.log(0 in people)  // true, 0在数组对象的index中
console.log(5 in people)  // false 5不在数组对象的index中
console.log('Curry' in people)  // false 'Curry'是值,不是属性
console.log('length' in people)  // true
console.log('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')

// custom objects
let mycar = {
    color: 'black',
    brand: 'Porsche Cayenne',
    price: '¥1000000'
}

console.log('color' in mycar)  // true
console.log('model' in mycar)  // false
console.log('brand' in mycar)  // true

3. 表达式

基本表达式和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 }
*/

猜你喜欢

转载自blog.csdn.net/sqsltr/article/details/94115710