注释
和C、Java一样
//单行注释
/*注释和*/多行注释,也可以用在语句中
str = 'hello' + /*comment*/' test'
console.log(str)
常量和变量
标识符
标识符必须是字母、下划线、美元符号$和数字,但必须是字母、下划线、美元符号开头,依然是不能数
字开头就行。
标识符区分大小写
声明
- var声明一个变量
- let声明一个块作用域中的局部变量(推荐)
- const声明一个常量
JS中的变量声明和初始化是可以分开的
var a //只是声明,a 为undefined
let b
console.log(1,a,b);
a = 1
b = 'a string'
console.log(2,a,b);
const c = 100 // 常量必须声明时赋值,之后不能再改
console.log(c)
var y //只是声明,y值为undefined
var x = 5 // 规范的声明并初始化,声明全局或局部变量。
z = 6 // 不规范的初始化,不推荐。在严格模式下会产生异常。在赋值之前不能引用,因为它没有声明。一旦这样赋值就是全局作用域。
//变量提升
console.log(a);//此时a 为undefined
var a
a = 5
//let 不会使变量提升
console.log(b)
let b
b = 2
数据类型
序号 | 名称 | 说明 |
---|---|---|
1 | number | 数值型,包括整型和浮点型 |
2 | boolean | 布尔型,true和false |
3 | string | 字符串 |
4 | null | 只有一个值null |
5 | undefined | 变量声明未赋值的;对象未定义的属性 |
6 | symbol | ES6 新引入类型 |
7 | object类型 | 是以上基本类型的复合类型,是容器 |
ES是动态语言,弱类型语言。
虽然先声明了变量,但是变量可以重新赋值为任何类型。
//类型转换
//弱类型 任何东西和字符串相加都是字符串
console.log("======string======")
console.log(a = 3 + 'wwww',typeof a)
console.log(a = 3 + 'wwww', typeof(a))
console.log(a = null + 'wwww', typeof(a))
console.log(a = undefined + 'wwww', typeof(a))
console.log(a = true + 'wwww', typeof(a))
//数字
console.log('=======number=======')
console.log(a = null + 8,typeof a) //8
console.log(a = undefined + 8,typeof a)//NaN number /undefined没法转换成一个对应的数字
console.log(a = true + 8, typeof(a)) //true 看作1 返回9
console.log(a = false + 8, typeof(a)) //false看作0 返回8
// boolean
console.log('=====bool=====')
console.log(a = null + true, typeof(a)) //1
console.log(a = null + false, typeof(a)) //0
console.log(a = undefined + true, typeof(a)) //undefined没法转换成一个对应的数字
console.log(a = undefined + false, typeof(a)) // NaN
console.log(a = null & true, typeof(a)) //0
console.log(a = undefined & true, typeof(a)) //0
//短路
console.log(a = null && true, typeof(a)) // 逻辑运算符,null 直接就是false短路
console.log(a = false && null, typeof(a)) // 逻辑运算符,false短路返回false
console.log(a = false && 'www', typeof(a)) // boolean
console.log(a = true && 'www', typeof(a)) // 字符串
console.log(a = true && '' && 'abc', typeof(a)) // 字符串
// 短路补充
console.log(a = [] && 'abc', typeof(a)) //返回abc
console.log(a = {} && 'abc', typeof(a)) //返回abc
NaN,即Not a Number,转换数字失败。它和任何值都不等,和自己也不等,只能使Number.isNaN(NaN)判断。
总结
遇到字符串,加号就是拼接字符串,所有非字符串隐式转换为字符串。
如果没有字符串,加号把其他所有类型都当数字处理,非数字类型隐式转换为数字。undefined特殊,因为它都没有定义值,所以转换数字失败得到一个特殊值NaN。
如果运算符是逻辑运算符,短路符,返回就是短路时的类型。没有隐式转换。
字符串
将一个值使用’ 单引号或者 " 双引号 引用起来就是字符串。
ES6提供了反引号定义一个字符串,可以支持多行,还支持插值。
let a = 'abc'
let b = "135"
let c = `line1
line2
line3
` // 支持多行
console.log(c)
// 字符串插值,要求在反引号字符串中。python3.6支持
let name="tom", age = 19
console.log(`Hi, my name is ${name}. I am ${age}`)
字符串操作方法
let str = 'abcdef'
console.log(str.length)
console.log(str.charAt(2)) //g
console.log(str[2]); //g
console.log(str.toUpperCase()); // 返回大写 ABCDEF
console.log(str.concat('.com')); //连接
console.log(str.slice(3)); //切片 def
console.log(str.slice(3,5))
console.log(str.slice(-2, -1))
console.log(str.slice(-2))
let str = 'abcdef'
console.log(str.length)
console.log(str.charAt(2)) //g
console.log(str[2]); //g
console.log(str.toUpperCase()); // 返回大写 ABCDEF
console.log(str.concat('.com')); //连接
console.log(str.slice(3)); //切片 def
console.log(str.slice(3,5))
console.log(str.slice(-2, -1))
console.log(str.slice(-2))
let url = "www.baidu.com"
console.log(url.split('.'))
console.log(url.substr(7,2)) // 返回子串从何处开始,取多长
console.log(url.substring(7,10)) // 返回子串,从何处开始,到什么为止
let s = 'baidu.net'
console.log(s.replace('.', '.com'))
数值型number
在JS中,数据均为双精度浮点型范围只能在 -(2^53 -1) 和 2^53 -1之间,整型也不例外。
数字类型还有三种符号值:+Infinity(正无穷)、-Infinity(负无穷)和 NaN (not-a-number非数字)。
数字的常用方法
方法 | 描述 |
---|---|
Number.parseFloat() | 把字符串参数解析成浮点数,和全局方法 parseFloat() 作用一致 |
Number.parseInt() | 把字符串解析成特定基数对应的整型数字,和全局方法 parseInt() 作用一致 |
Number.isFinite() | 判断传递的值是否为有限数字 |
Number.isInteger() | 判断传递的值是否为整数 |
Number.isNaN() | 判断传递的值是否为 NaN。Nan唯一判断方式 |
//parseInt()
let a = '1.1'
let b = 2.6
let c = 'c'
console.log(Number.parseInt(a)); 1
console.log(Number.parseInt(b)); 2
console.log(Number.parseInt(c)); NaN
let a = '1.1'
let b = 2.6
let c = 'c'
console.log(Number.parseFloat(a)); 1.1
console.log(Number.parseFloat(b)); 2
console.log(Number.parseFloat(c)); NaN
内置数学对象Math
Math提供了绝对值、对数指数运算、三角函数运算、最大值、最小值、随机数、开方等运算函数,提供了PI值。
console.log(Math.PI)
console.log(Math.abs(-1)) //绝对值
console.log(Math.log2(16)) //对数运算
console.log(Math.sqrt(4)) //开方
console.log(Math.pow(2, 3)) //幂运算
console.log(Math.random()) // (0, 1)之间的随机数
运算符
算数运算符
+ - * / %
等运算符和Python一样
console.log(1/2) // 0.5自然除
console.log(1/0) //返回无穷大
console.log(5 % 3) //取余
console.log(2 ** 3) //幂运算
//parseInt()
// let a = '1.1'
// let b = 2.6
// let c = 'c'
// console.log(Number.parseInt(a));
// console.log(Number.parseInt(b));
// console.log(Number.parseInt(c));
//parseFloat()
// let a = '1.1'
// let b = 2
// let c = 'c'
// console.log(Number.parseFloat(a));
// console.log(Number.parseFloat(b));
// console.log(Number.parseFloat(c));
// console.log(Math.PI)
// console.log(Math.abs(-1)) //绝对值
// console.log(Math.log2(16)) //对数运算
// console.log(Math.sqrt(4)) //开方
// console.log(Math.pow(2, 3)) //幂运算
// console.log(Math.random()) // (0, 1)
// console.log(1/2) // 0.5自然除
// console.log(1/0) //返回无穷大
// console.log(5 % 3) //取余
// console.log(2 ** 3) //幂运算
//向上取整
console.log(parseInt(0.1), parseInt(0.5), parseInt(0.6), parseInt(1.2),
parseInt(1.5), parseInt(1.7))
console.log(parseInt(-0.1), parseInt(-0.5), parseInt(-0.6), parseInt(-1.2),
parseInt(-1.5), parseInt(-1.7))
//向下取整 返回小于等于一个给定数字的
console.log(Math.floor(0.1), Math.floor(0.5), Math.floor(0.6),
Math.floor(1.2), Math.floor(1.5), Math.floor(1.7))
//向下取整
console.log(Math.floor(-0.1), Math.floor(-0.5), Math.floor(-0.6),
Math.floor(-1.2), Math.floor(-1.5), Math.floor(-1.7))
//向上取整
console.log(Math.ceil(0.1), Math.ceil(0.5), Math.ceil(0.6), Math.ceil(1.2),
Math.ceil(1.5), Math.ceil(1.7))
console.log(Math.ceil(-0.1), Math.ceil(-0.5), Math.ceil(-0.6),
Math.ceil(-1.2), Math.ceil(-1.5), Math.ceil(-1.7))
/**
* 将一个数字四舍五入为最接近的整数。
* 如果 x 是正数,并且小数部分大于等于 0.5,则返回大于 x 的最小整数。
* 如果 x 是正数,并且小数部分小于 0.5,则返回小于 x 的最大整数。
* 如果 x 是负数,并且小数部分大于等于 -0.5,则返回小于 x 的最大整数。
* 如果 x 是负数,并且小数部分小于 -0.5,则返回大于 x 的最小整数。
*/
console.log(Math.round(0.1), Math.round(0.5), Math.round(0.6),
Math.round(1.2), Math.round(1.5), Math.round(1.7))
console.log(Math.round(-0.1), Math.round(-0.5), Math.round(-0.6),
Math.round(-1.2), Math.round(-1.5), Math.round(-1.7))
++ 和 --
单目运算符,代表变量自增、自减
i++
先用i,用完之后i再子增加1
++i
i先自增,再使用i
比较运算符
>、<、>=、<= 和python没有什么区别
!=、==
!==、===
== 宽松相等,进行类型转换
=== 严格相等,不进行类型转换
console.log(100 > 200) // false
console.log(100 > '200') // 字符、数字? // false
console.log(1000 > '200') // 数字? // true
console.log(1000 > '2') // true
console.log('1000' > 2) // true
console.log('1000' > '2') // false
console.log(1000 > '2a') // false
console.log(3000 > '2a') // false
// 宽松比较
console.log(300 == '300') // true
console.log('200' == '200') // true
// 严格比较 ===
console.log(300 === '300') // false
console.log('200' === '200') // true
逻辑运算符
&& 、 || 、!
与、或、非
这些运算符和其他高级语言都一样,支持短路
三元运算符
条件表达式?真值:假值
等价于简单的if...else结构
if (条件表达式) {
真值
} else {
假值
}
console.log((3 > 30)?'真':'假');
逗号操作符
js运行多个表达式写在一起
let a = 4+5, b = true, c=a > 20 ?'t':'f'
console.log(a)
console.log(c)
//逗号表达式是有值的,值取决于最后一个表达式的值
function test() {
return 3, a + b, c = a++
}
console.log(test()) // 结果是什么 9
console.log(c) // 结果是什么9
其他
名称 | 说明 |
---|---|
instanceof | 判断是否属于指定类型 |
typeof | 返回类型字符串 |
delete | delete操作符, 删除一个对象(an object)或一个对象的属性(an object’s property)或者一个数组中某一个键值(an element at a specified index in an array)。 |
in | 如果指定的属性在对象内,返回true |