《你所不知道的javascript》持续更新

386 阅读3分钟

本文观点来自于《你所不知道的javascript》

EcmaScript类型包含语言类型和规范类型

js内置7种类型:包含 undefined null boolean string number object symbol

1.typeof

  • typeof 会返回一个String

typeof typeof {} === "string"

  • typeof 具有安全机制,(对于undeclear变量的值返回undefined)
  • var a
    typeof a === "undefined"
    typeof b === "undefined"  //b是 undeclear
    // 我们试图console.log(b) javascript会报错
    // ReferenceError: b is not defined
    // 所以 undefined 和 undeclear不一样,此处a 是undefined b是undeclaear
    // 看下面代码
    // 想看存不存其他的js文件包不包含一个变量,可能会写下这个代码
    if($jq){
    //xxx    }
    //如果$jq没声明,会报错,利用typeof的安全防御机制能帮帮我们解决
    if(typeof $jq!== "undefined")

我们可以用typeof 运算符来查看值的类型

typeof undefined ==== "undefined"
typeof true === "boolean"
typeof 42 === "number"
typeof Symbol() === "symbol"
typeof null === "object"

typeof null 是javascript留下的一个bug,存在20年余,也许不会修复。

(!a && typeof a === "object") //true

可以通过上述方法判断是否为null

2.function

function 是javascript的内置类型,实际上是object 的一个 “子类型”

函数不仅仅是对象,可以拥有属性,例如length

function a(b,c){
    a.b = b
    a.c = c
}
console.log(a.length) == 2

3 数组

数组也是对象,它是object子类型

typeof [1,2,3] === "object"  //true

js基础知识复习-第二章(值)

array string number 是一个程序最基本的组成部分,但在js中,它们让人喜忧掺半。

1.数组

  • js的数组可以容纳任何类型的值

var a = [1,"2",[3]]
  • 使用delete可以从数组中数组,单元删除数组的length并不会变化

var a = [1,"2",[3]]
delete a[0]
console.log(a,a.length)
//[empty, "2", Array(1)] 3
  • 数组和对象一样包含字符串键值key和属性,但是不会改变length

var a = [1,"2",[3]]
a["foo"] = "foo"
a.length === 3
a.foo === "foo"

  • key值如果可以被强制类型转换为十进制数字,会当做数组索引处理

var a = [1,"2",[3]]
a["13"] = 42
a.length //14

2.类数组 - 具有数组的length和结构但是没有数组的一些方法

docuemnt.getElementByTagName("div")返回的值和function 的arguments都是类数组

,为了方便计算,我们需要把他们转成数组

// 方法1
var arr = Array.from(arguments)
// 方法2
Array.prototype.slice.call(arguments)

3.字符串

字符串反转

string.split("") //string => array
.reverse() //array reverse
.join() //array => string

4.数字

number 采用IEEE 754双精度格式

// toExponential() 可以输出指数格式
var a = 500000000000
b = a.toExponential() //5e+11
//toFixed() 可以取小数后的位数
var a = 10.22334
a.toFixed(2) === 10.22
10.toFixed(2) // 报错 Uncaught SyntaxError: Invalid or unexpected token
0.1 + 0.2 === 0.3 //false

整数的安全范围

参照mdn解释

Number.MAX_SAFE_INTEGER //9007199254740991
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_SAFE_INTEGER   //-9007199254740991

Number.isInterger() 检测是否在整数的安全范围之内

//polifly
Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

void 0 和 void 1 等同于undefined

NaN

typeof不能判断number是否是NaN,应该用isNaN判断

let a = 1/'111a'
tupeof a === "unmber" //true
//es6 在Number.isNaN()

无穷数 Infinity

Number.MAX_VALUE + 大于0 的数都是 Infinity