1. 数值型
在JS中,数据均为双精度浮点型,范围只能在-()到之间,整型也不例外。数字类型还有三种符号值:+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 }
*/