变量
变量是对“值”的具名引用。变量就是为“值”起名,然后引用这个名字,就等同于引用这个值。变量的名字就是变量名。
变量就是保存值的占位符,就像二元一次方程的未知数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`- `""`或`''`(空字符串)```javascriptif ('') {console.log('true');}// 没有任何输出
上面代码中,if命令后面的判断条件,预期应该是一个布尔值,所以 JavaScript 自动将空字符串,转为布尔值false,导致程序不会进入代码块,所以没有任何输出。
注意,空数组([])和空对象({})对应的布尔值,都是true。
if ([]) {console.log('true');}// trueif ({}) {console.log('true');}// true
数值
NaN
(1)含义NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。
5 - 'x' // NaNlet a = "number";let b = 10;let c = a / b;console.log(c); // NaNconsole.log(typeof c); // number
上面代码运行时,会自动将字符串x转为数值,但是由于x不是数值,所以最后得到结果为NaN,表示它是“非数字”(NaN)。
另外,一些数学函数的运算结果会出现NaN。
Math.acos(2) // NaNMath.log(-1) // NaNMath.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 // NaNNaN - 32 // NaNNaN * 32 // NaNNaN / 32 // NaN
类型转换
隐式转换
数字字符+数字,数字转换为字符串
console.log(20+'20'); // 2020// 调换位置亦可console.log('20'+20); // 2020
数字字符与数字做非加法运算,字符串隐式转换为数字
console.log('20'-10); // 10console.log(10*'10'); // 100console.log(10/'2'); // 5
数字字符串之间非加法运算,转换为数字
console.log('20'-'10'); // 10console.log('20'/'10'); // 2console.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`。```javascriptisNaN(NaN) // trueisNaN(123) // false
但是,isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串。
isNaN('Hello') // true// 相当于isNaN(Number('Hello')) // true
出于同样的原因,对于对象和数组,isNaN也返回true。
isNaN({}) // true// 等同于isNaN(Number({})) // trueisNaN(['xzy']) // true// 等同于isNaN(Number(['xzy'])) // true
但是,对于空数组和只有一个数值成员的数组,isNaN返回false。
isNaN([]) // falseisNaN([123]) // falseisNaN(['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) // falseisFinite(-Infinity) // falseisFinite(NaN) // falseisFinite(undefined) // falseisFinite(null) // trueisFinite(-1) // true
除了Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true。
运算符
相等(==)全等(===)
区别:后者在此基础上判断类型是否相同
let number1 = '45';let number2 = 45;console.log(number1 == number2); // trueconsole.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('代码被执行了'); // 不会被执行}
