变量

变量是对“值”的具名引用。变量就是为“值”起名,然后引用这个名字,就等同于引用这个值。变量的名字就是变量名。
变量就是保存值的占位符,就像二元一次方程的未知数x,y一样,临时保存值,方便引用

  • let
  • const

    let和const异同点

    异同点一

  • let 定义的变量可以被多次重新赋值

  • const 变量只能赋值一次

异同点二

JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。

  1. console.log(a);
  2. var a = 1;

上面代码首先使用 console.log方法,在控制台(console)显示变量a的值。这时变量a还没有声明和赋值,所以这是一种错误的做法,但是实际上不会报错。因为存在变量提升,真正运行的是下面的代码。

  1. var a;
  2. console.log(a);
  3. a = 1;

最后的结果是显示 undefined,表示变量 a已声明,但还未赋值。

JS中 let 和var的区别

数据类型(基本类型(值类型)and 引用数据类型)

JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型。(ES6 又新增了第七种 Symbol 类型的值,本教程不涉及。)
基本类型:

  • 数值(number):整数和小数(比如13.14
  • 字符串(string):文本(比如Hello World)。
  • 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
  • undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:表示空值,即此处的值为空。

引用数据类型:

  • 对象(Object)
  • 数组(Array)
  • 函数(Function)

    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”

  1. <a name="DN978"></a>
  2. # 布尔值
  3. 如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为`false`,其他值都视为`true`。
  4. - `undefined`
  5. - `null`
  6. - `false`
  7. - `0`
  8. - `NaN`
  9. - `""`或`''`(空字符串)
  10. ```javascript
  11. if ('') {
  12. console.log('true');
  13. }
  14. // 没有任何输出

上面代码中,if命令后面的判断条件,预期应该是一个布尔值,所以 JavaScript 自动将空字符串,转为布尔值false,导致程序不会进入代码块,所以没有任何输出。

注意,空数组([])和空对象({})对应的布尔值,都是true

  1. if ([]) {
  2. console.log('true');
  3. }
  4. // true
  5. if ({}) {
  6. console.log('true');
  7. }
  8. // true

数值

NaN

(1)含义
NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。

  1. 5 - 'x' // NaN
  2. let a = "number";
  3. let b = 10;
  4. let c = a / b;
  5. console.log(c); // NaN
  6. console.log(typeof c); // number

上面代码运行时,会自动将字符串x转为数值,但是由于x不是数值,所以最后得到结果为NaN,表示它是“非数字”(NaN)。
另外,一些数学函数的运算结果会出现NaN

  1. Math.acos(2) // NaN
  2. Math.log(-1) // NaN
  3. Math.sqrt(-1) // NaN

0除以0也会得到NaN

  1. 0 / 0 // NaN

需要注意的是,NaN不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于Number,使用typeof运算符可以看得很清楚。

  1. typeof NaN // 'number'

(2)运算规则
NaN不等于任何值,包括它本身。

  1. NaN === NaN // false

数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。

  1. [NaN].indexOf(NaN) // -1

NaN在布尔运算时被当作false

  1. Boolean(NaN) // false

NaN与任何数(包括它自己)的运算,得到的都是NaN

  1. NaN + 32 // NaN
  2. NaN - 32 // NaN
  3. NaN * 32 // NaN
  4. NaN / 32 // NaN

类型转换

隐式转换

  • 数字字符+数字,数字转换为字符串

    1. console.log(20+'20'); // 2020
    2. // 调换位置亦可
    3. console.log('20'+20); // 2020
  • 数字字符与数字做非加法运算,字符串隐式转换为数字

    1. console.log('20'-10); // 10
    2. console.log(10*'10'); // 100
    3. console.log(10/'2'); // 5
  • 数字字符串之间非加法运算,转换为数字

    1. console.log('20'-'10'); // 10
    2. console.log('20'/'10'); // 2
    3. 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

  1. <a name="parsefloat"></a>
  2. ### parseFloat()
  3. `parseFloat`方法用于将一个字符串转为浮点数。
  4. <a name="isnan"></a>
  5. ### isNaN()
  6. `isNaN`方法可以用来判断一个值是否为`NaN`<br />`isNaN`方法可以用来判断一个值是否为`NaN`。
  7. ```javascript
  8. isNaN(NaN) // true
  9. isNaN(123) // false

但是,isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaNtrue的值,有可能不是NaN,而是一个字符串。

  1. isNaN('Hello') // true
  2. // 相当于
  3. isNaN(Number('Hello')) // true

出于同样的原因,对于对象和数组,isNaN也返回true

  1. isNaN({}) // true
  2. // 等同于
  3. isNaN(Number({})) // true
  4. isNaN(['xzy']) // true
  5. // 等同于
  6. isNaN(Number(['xzy'])) // true

但是,对于空数组和只有一个数值成员的数组,isNaN返回false

  1. isNaN([]) // false
  2. isNaN([123]) // false
  3. isNaN(['123']) // false

上面代码之所以返回false,原因是这些数组能被Number函数转成数值,请参见《数据类型转换》一章。
因此,使用isNaN之前,最好判断一下数据类型。

  1. function myIsNaN(value) {
  2. return typeof value === 'number' && isNaN(value);
  3. }

判断NaN更可靠的方法是,利用NaN为唯一不等于自身的值的这个特点,进行判断。

  1. function myIsNaN(value) {
  2. return value !== value;
  3. }

isFinite()

isFinite方法返回一个布尔值,表示某个值是否为正常的数值。

  1. isFinite(Infinity) // false
  2. isFinite(-Infinity) // false
  3. isFinite(NaN) // false
  4. isFinite(undefined) // false
  5. isFinite(null) // true
  6. isFinite(-1) // true

除了Infinity-InfinityNaNundefined这几个值会返回falseisFinite对于其他的数值都会返回true

运算符

相等(==)全等(===)

区别:后者在此基础上判断类型是否相同

  1. let number1 = '45';
  2. let number2 = 45;
  3. console.log(number1 == number2); // true
  4. console.log(number1 === number2); // false

两种布尔运算的简便写法

image.png

  1. let str = 'Bob';
  2. if (str) {
  3. console.log('代码被执行了'); // 会被执行
  4. }
  5. // 上面代码等同于
  6. if(str !== ''){
  7. console.log('代码被执行了'); // 会被执行
  8. }
  9. let str = ''; // 特别注意一下,空格也是非空字符串
  10. if (str) {
  11. console.log('代码被执行了'); // 不会被执行
  12. }
  13. // 上面代码等同于
  14. if(str !== ''){
  15. console.log('代码被执行了'); // 不会被执行
  16. }