JS 初始介绍
学习来源:
https://wangdoc.com/javascript/types/number.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof
https://juejin.im/post/5b0b9b9051882515773ae714
概述
-
在 JS 中,一共有 7 种数据类型,分别是 Number,String,Boolean, Object, null,undefined,symbol(ES6 新增)
- 在这之中 Number,String,Boolean 是原始类型(primitive type)
- Object 是合成类型 complex type,包括以下:
- 狭义对象
- array
- function
- null,undefined 是特殊值
-
typeof 运算符:用于确定一个值是什么类型,回传一个 String。实质上是通过数据存储中的类型标签判断。
- typeof: 用于区分一般的数据类型,但是很明显下列代码中,无法区分 array 和 object。并且无法区分出 null
- typeof null 的结果是 object。JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的标签是 0, null 代表空指针,大多数平台下为 0x00,因此 null 的类型标签也就变成是 0 了.
- 同时除了 new function 以外, 所有用 new 宣告的的实例,typeof 返回的都是 ‘object’
- 对正则表达式字面量的类型判断在某些浏览器中不符合标准,谨慎使用
let a = {} console.log(typeof(a)) // object let b = [] console.log(typeof(b)) // object let c = null console.log(typeof(c)) // object let d = () => {} console.log(typeof(d)) // function let e = new String('123') console.log(typeof e) // object let f = new Number(1) console.log(typeof f) // object let g = new Function() console.log(typeof g) // function
- instanceof:应用这个可以区分 array 和 object。本质上来说 instance of 是用于判断一个实例是否属于某种类型。也可以判断一个实例是否是其父类型或者祖先类型的实例。
let a = {} console.log(a instanceof Array) // object let b = [] console.log(b instanceof Array) // array let person = function () { } let nicole = new person() nicole instanceof person // true
- 一个比较好的判定内置数据类型的方法是 Object.prototype.toString
Object.prototype.toString.call(1) // "[object Number]" Object.prototype.toString.call('hi') // "[object String]" Object.prototype.toString.call({a:'hi'}) // "[object Object]" Object.prototype.toString.call([1,'a']) // "[object Array]" Object.prototype.toString.call(true) // "[object Boolean]" Object.prototype.toString.call(() => {}) // "[object Function]" Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(undefined) // "[object Undefined]" Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
- 同时在 ES6 下, typeof 不再是百分百安全的一行指令,有可能出现报错的情况。
// exp1 typeof(a) //'undefined' 安全执行 var a = 1 // exp2 EX6 typeof(a) // ReferenceError: a is not defined 报错。 // 这里是由于 let 不会发生变量提升,并且存在暂时性死区 // 简单来说就是,使用 let 宣告的变数,在没有宣告之前是无法获取的。 // 用 var 宣告的变数,因为存在变量提升,所以会提升至代码的开头,所以实际上已经提前宣告过了 // 但是没有赋值,所以是undefined let a = 1
-
语句 与 表达式
- 语句表示的是进行某种操作,一般不需要有返回值
- 表达式是指的是为了得到某种结果的计算式,需要返回值
- 范例: let a = 1 + 3
- let a = 1 + 3 是一个赋值语句,1 + 3 是表达式
-
变量
- 在 JS 的世界中,如果宣告一个变量,却不给它赋值的话,那么这个变量就会是 undefined,这并不等于 not defined,如果想使用一个没有宣告过得变量,就会报错,并且会得到 not defined 的错误通知。
- 变量提升:
- 在 JS 的世界中存在一个特殊的机制,变量提升。
- 变量提升说的是,js 在解析代码的时候,会将所有 var 的宣告语句放到最头部,这就叫变量提升(hoisting)。也就是说如果用 var 宣告一个变量,这个变量在你程式码的宣告顺序之前就可以调用,只是此时的结果是 undefined。
- 上述特征只在 var 的变量有效,let 宣告的变量就不会发生。
console.log(b)
console.log(a)
let a
var b
// undefined
// a is not defined
-
标识符
- 定义:用于识别各种值的合法名称
-
区块
- JS 中用大括号表示代码区块,对于 var 指令而言,区块不构成单独的作用域。对于 var 宣告的参数而言,只存在函数作用域,全局作用域,并不存在区块作用域。
{
var a = 1;
}
a // 1
- 条件语句
- JS 中 =, ==, ===,分别代表的意思是赋值,相等运算符,严格相等运算符
- 为了防止日常使用的过程中,我们将 = 与另外二者搞混,比如说 if(x=2),这个语句是会正常执行,这样我们 debug 的时候可能会不太好发现,为了避免这种情况,通常在条件语句中,可以将常量放置于左边,避免该状况的发生,因为如果 if(2=x) 就会直接报错了,容易发现 bug。