变量
变量是对“值”的具名引用。变量就是为“值”起名,然后引用这个名字,就等同于引用这个值。变量的名字就是变量名。
变量就是保存值的占位符,就像二元一次方程的未知数x,y一样,临时保存值,方便引用
异同点二
- let 定义变量的时候可以不赋初值
- const 要赋初始值,否则报错
变量提升
变量提升和函数提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
console.log(a);
var a = 1;
上面代码首先使用 console.log
方法,在控制台(console)显示变量a
的值。这时变量a
还没有声明和赋值,所以这是一种错误的做法,但是实际上不会报错。因为存在变量提升,真正运行的是下面的代码。
var a;
console.log(a);
a = 1;
最后的结果是显示 undefined
,表示变量 a
已声明,但还未赋值。
JS中 let 和var的区别
数据类型(基本类型(值类型)and 引用数据类型)
JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型。(ES6 又新增了第七种 Symbol 类型的值,本教程不涉及。)
基本类型:
- 数值(number):整数和小数(比如
1
和3.14
) - 字符串(string):文本(比如
Hello World
)。 - 布尔值(boolean):表示真伪的两个特殊值,即
true
(真)和false
(假) undefined
:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值null
:表示空值,即此处的值为空。
引用数据类型:
- 对象(Object)
- 数组(Array)
-
typeof 运算符
JavaScript 有三种方法,可以确定一个值到底是什么类型。
typeof
运算符instanceof
运算符Object.prototype.toString
方法 ```javascript typeof 123 // “number” typeof ‘123’ // “string” typeof false // “boolean”
//函数返回function function f() {} typeof f // “function”
//undefined返回undefined。 typeof undefined // “undefined”
//利用这一点,typeof可以用来检查一个没有声明的变量,而不报错。 v // ReferenceError: v is not defined typeof v // “undefined”
//对象返回object,(instanceof运算符可以区分数组和对象) typeof window // “object” typeof {} // “object” typeof [] // “object” typeof null // “object”
<a name="DN978"></a>
# 布尔值
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为`false`,其他值都视为`true`。
- `undefined`
- `null`
- `false`
- `0`
- `NaN`
- `""`或`''`(空字符串)
```javascript
if ('') {
console.log('true');
}
// 没有任何输出
上面代码中,if
命令后面的判断条件,预期应该是一个布尔值,所以 JavaScript 自动将空字符串,转为布尔值false
,导致程序不会进入代码块,所以没有任何输出。
注意,空数组([]
)和空对象({}
)对应的布尔值,都是true
。
if ([]) {
console.log('true');
}
// true
if ({}) {
console.log('true');
}
// true
数值
NaN
(1)含义NaN
是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。
5 - 'x' // NaN
let a = "number";
let b = 10;
let c = a / b;
console.log(c); // NaN
console.log(typeof c); // number
上面代码运行时,会自动将字符串x
转为数值,但是由于x
不是数值,所以最后得到结果为NaN
,表示它是“非数字”(NaN
)。
另外,一些数学函数的运算结果会出现NaN
。
Math.acos(2) // NaN
Math.log(-1) // NaN
Math.sqrt(-1) // NaN
0
除以0
也会得到NaN
。
0 / 0 // NaN
需要注意的是,NaN
不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于Number
,使用typeof
运算符可以看得很清楚。
typeof NaN // 'number'
(2)运算规则NaN
不等于任何值,包括它本身。
NaN === NaN // false
数组的indexOf
方法内部使用的是严格相等运算符,所以该方法对NaN
不成立。
[NaN].indexOf(NaN) // -1
NaN
在布尔运算时被当作false
。
Boolean(NaN) // false
NaN
与任何数(包括它自己)的运算,得到的都是NaN
。
NaN + 32 // NaN
NaN - 32 // NaN
NaN * 32 // NaN
NaN / 32 // NaN
类型转换
隐式转换
数字字符+数字,数字转换为字符串
console.log(20+'20'); // 2020
// 调换位置亦可
console.log('20'+20); // 2020
数字字符与数字做非加法运算,字符串隐式转换为数字
console.log('20'-10); // 10
console.log(10*'10'); // 100
console.log(10/'2'); // 5
数字字符串之间非加法运算,转换为数字
console.log('20'-'10'); // 10
console.log('20'/'10'); // 2
console.log('20'*'10'); // 200
与数值相关的全局方法
parseInt()
```javascript 整数字符串转换为整数 let number = ‘20’; // 将number转换为整数类型 let converNumber = parseInt(number); console.log(converNumber); // 20 // 判断转换后的数据类型 console.log(typeof converNumber); // number
小数字符串转换为整数 let number = ‘20.5’; let converNumber = parseInt(number); console.log(converNumber); // 20 不足21一律按照20算 console.log(typeof converNumber); // number
小数转为整数 let number = 20.5; let converNumber = parseInt(number); console.log(converNumber); // 20
<a name="parsefloat"></a>
### parseFloat()
`parseFloat`方法用于将一个字符串转为浮点数。
<a name="isnan"></a>
### isNaN()
`isNaN`方法可以用来判断一个值是否为`NaN`<br />`isNaN`方法可以用来判断一个值是否为`NaN`。
```javascript
isNaN(NaN) // true
isNaN(123) // false
但是,isNaN
只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN
,所以最后返回true
,这一点要特别引起注意。也就是说,isNaN
为true
的值,有可能不是NaN
,而是一个字符串。
isNaN('Hello') // true
// 相当于
isNaN(Number('Hello')) // true
出于同样的原因,对于对象和数组,isNaN
也返回true
。
isNaN({}) // true
// 等同于
isNaN(Number({})) // true
isNaN(['xzy']) // true
// 等同于
isNaN(Number(['xzy'])) // true
但是,对于空数组和只有一个数值成员的数组,isNaN
返回false
。
isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false
上面代码之所以返回false
,原因是这些数组能被Number
函数转成数值,请参见《数据类型转换》一章。
因此,使用isNaN
之前,最好判断一下数据类型。
function myIsNaN(value) {
return typeof value === 'number' && isNaN(value);
}
判断NaN
更可靠的方法是,利用NaN
为唯一不等于自身的值的这个特点,进行判断。
function myIsNaN(value) {
return value !== value;
}
isFinite()
isFinite
方法返回一个布尔值,表示某个值是否为正常的数值。
isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true
除了Infinity
、-Infinity
、NaN
和undefined
这几个值会返回false
,isFinite
对于其他的数值都会返回true
。
运算符
相等(==)全等(===)
区别:后者在此基础上判断类型是否相同
let number1 = '45';
let number2 = 45;
console.log(number1 == number2); // true
console.log(number1 === number2); // false
两种布尔运算的简便写法
let str = 'Bob';
if (str) {
console.log('代码被执行了'); // 会被执行
}
// 上面代码等同于
if(str !== ''){
console.log('代码被执行了'); // 会被执行
}
let str = ''; // 特别注意一下,空格也是非空字符串
if (str) {
console.log('代码被执行了'); // 不会被执行
}
// 上面代码等同于
if(str !== ''){
console.log('代码被执行了'); // 不会被执行
}