数据类型&&变量
数据类型
JavaScript共有六种数据类型(ES6新增Symbol类型的值)
- 数值(number)
- 字符串(String)
- 布尔类型(Boolean)
- undefined:
- null
- 对象(Object)
原始数据类型(值类型)
他们是最基本的数据类型,不能再细分了。
- Number
- String
- Boolean
- Null
- 表示一个空对象指针,使用typeof操作符检测null时会返回object。
- Undefined
- 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性,函数没有返回值时,默认返回undefined。
合成数据类型(引用类型)
对象是合成类型的统称,一个对象有多个原始类型的值合成,可以看做是一个存放各种值的容器。undefined和null是两个特殊的值。对象是最复杂的数据类型,可以分为三个子类
- Object(狭义的对象)
- 对象是一组属性与方法的集合。
- Array
- 数组的每一项可以用来保存任何类型的数据,数组的大小是可以动态调整的。
- Function
- 函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。 创建函数方式
数据类型检测
-
typeof
- Number String Boolean undefined function 可以用typeof 运算符检测出来。
- {} [] window null 则会返回object;
-
instanceof
该运算符可以区分对象和数组
null&&undefined
null是一个表示“空”的对象,转为数值时为0;undefined是一个表示”此处无定义”的原始值,转为数值时为NaN
变量
函数及变量的声明都将被提升到函数的最顶部。变量可以在使用后声明,也就是变量可以先使用再声明。
变量计算
- 字符串拼接
- ==运算符
- if语句
- 逻辑运算
//字符串拼接
var a = 100 + 10 // 110
var b = 100 + '10' // '10010'
//==运算符
100 == '100' // true (把数字100转化为字符串‘100’进行比较)
0 == '' // true (把数字0转化为false, 把空字符串转化为false 进行比较)
null == undefined // true (null、undefined转化为false相比)
//if语句
var a = true
if(a){
// 可以进入if语句
}
var b = 100
if(b){
// 可以进入if语句, b=100转化为了true
}
var c = ''
if(c){
// 无法进入if语句, 因为c=''转化为了false
}
//逻辑运算
console.log(10 && 0) //0
console.log('' || 'abc') //'abc'
console.log(!window.abc) //true
var a = 100
console.log(!!a) // true
字符串
- 字符串转义
一个普通标题 | 一个普通标题 |
---|---|
\0 | null(\u0000) |
\b | 后退键(\u0008) |
\b | 后退键(\u0008) |
\f | 换页符(\u000C) |
\n | 换行符(\u000A) |
\r | 回车键(\u000D) |
\t | 制表符(\u0009) |
\v | 垂直制表符(\u000B) |
' | 单引号(\u0027) |
" | 双引号(\u0022) |
\ | 反斜杠(\u005C) |
-
反斜杠
- \HHH
反斜杠后面紧跟三个八进制数(000到377),代表一个字符。HHH对应该字符的 Unicode 码点,比如\251表示版权符号。显然,这种方法只能输出256种字符。
- \xHH
\x后面紧跟两个十六进制数(00到FF),代表一个字符。HH对应该字符的 Unicode 码点,比如\xA9表示版权符号。这种方法也只能输出256种字符。
- \uXXXX
\u后面紧跟四个十六进制数(0000到FFFF),代表一个字符。XXXX对应该字符的 Unicode 码点,比如\u00A9表示版权符号。
-
字符串与数组
字符串可以被视为字符数组,可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)
- 字符集
JavaScript 使用Unicode字符集。JavaScript 引擎内部,所有字符都用 Unicode 表示。JavaScript 不仅以 Unicode 储存字符,还允许直接在程序中使用 Unicode 码点表示字符,即将字符写成\uxxxx的形式,其中xxxx代表该字符的 Unicode 码点。比如,\u00A9代表版权符号。每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。也就是说,JavaScript 的单位字符长度固定为16位长度,即2个字节。
但是,UTF-16 有两种长度:对于码点在U+0000到U+FFFF之间的字符,长度为16位(即2个字节);对于码点在U+10000到U+10FFFF之间的字符,长度为32位(即4个字节),而且前两个字节在0xD800到0xDBFF之间,后两个字节在0xDC00到0xDFFF之间。举例来说,码点U+1D306对应的字符为𝌆,它写成 UTF-16 就是0xD834 0xDF06。
- Base64 转码
文本里面包含一些不可打印的符号,比如 ASCII 码0到31的符号都无法打印出来,这时可以使用 Base64 编码,将它们转成可以打印的字符。另一个场景是,有时需要以文本格式传递二进制数据,那么也可以使用 Base64 编码。所谓 Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。
- JavaScript 原生提供两个 Base64 相关的方法。
// btoa():任意值转为 Base64 编码
// atob():Base64 编码转为原来的值
let text = 'Hello World!';
btoa(text) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
- 不适合非 ASCII 码的字符(中文),中文需要特殊处理
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
数值
JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。
-
数值范围
根据标准,64位浮点数的指数部分的长度是11个二进制位,意味着指数部分的最大值是2047(2的11次方减1)。也就是说,64位浮点数的指数部分的值最大为2047,分出一半表示负数,则 JavaScript 能够表示的数值范围为21024到2-1023(开区间),超出这个范围的数无法表示。如果一个数大于等于2的1024次方,那么就会发生“正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity。
Math.pow(2, 1024) // Infinity
如果一个数小于等于2的-1075次方(指数部分最小值-1023,再加上小数部分的52位),那么就会发生为“负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0。
Math.pow(2, -1075) // 0
JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
-
数值的表示法
可以用字面形式直接表示,比如35(十进制)和0xFF(十六进制)。
-
数值的进制
使用字面量(literal)直接表示一个数值时,JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。
| 进制 | 解释 |
| ------ | ------ | ------ |
| 十进制:| 没有前导0的数值。|
| 八进制:| 有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。|
| 十六进制:| 有前缀0x或0X的数值。|
| 二进制:| 有前缀0b或0B的数值。|
对象
对象就是“键值对”(key-value)的集合,是一种无序的复合数据集合。
对象的引用
不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。
- 浅拷贝
- 深拷贝
https://www.jianshu.com/p/f0a53b76ffbd
对象的操作
- 枚举自身属性(键)返回数组
Object.keys(obj)
- 删除对象属性 返回 true||fasle
delete obj.a
delete命令只能删除对象本身的属性,无法删除继承的属性;
- in 运算符
in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。不能识别哪些属性是对象自身的,哪些属性是继承的。
- for…in 循环
遍历一个对象的全部属性。
它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
它不仅遍历对象自身的属性,还遍历继承的属性。(前提是继承属性默认是否允许遍历)
//hasOwnProperty() 判断属性是来自自身还是原型
var obj = { Id: '12313' };
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key);
}
}
函数
函数声明
- 函数声明
- 函数表达式
- 构造函数
函数属性和方法
name 返回函数名字 函数表达式则返回变量名
length 返回函数预期传入的参数个数。
// length属性提供了一种机制,判断定义时和调用时参数的差异,以便实现面向对象编程的”方法重载“(overload)。
tostring 返回一个字符串 内容是函数源码
函数作用域
作用域(scope)指的是变量存在的范围。在 ES5 的规范中,Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域.
函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。函数体内部声明的函数,作用域绑定函数体内部。所以引入闭包,闭包就是通过函数外部可访问函数内部变量
arguments对象
arguments对象是一个伪数组,可以通过下标访问,但是不能使用数组方法,需要使用call apply方法进行绑定才能继承数组的方法。
Array.prototype.slice.call(arguments)
- callee 属性
返回他所对应的原函数
闭包
作用:1. 一个是可以读取函数内部的变量
2.封装对象的私有属性和私有方法
http://www.cnblogs.com/wangfupeng1988/p/3994065.html
自执行函数
JavaScript 引擎规定,如果function关键字出现在行首,一律解释成语句。因此,JavaScript引擎看到行首是function关键字之后,认为这一段都是函数的定义。不要让function出现在行首,让引擎将其理解成一个表达式。最简单的处理,就是将其放在一个圆括号里面。
(function(){ /* code */ }())
(function(){ /* code */ }())
eval 命令
eval命令的作用是,将字符串当作语句执行。
数据类型转换
强制转换
强制转换主要指使用Number、String和Boolean三个函数,手动将各种类型的值,分布转换成数字、字符串或者布尔值。
Number()
- 原始类型值
Number(123) 123
Number('123') // 123
Number('123a') // NaN
Number('') // 0
Number(true) // 1
Number(false) // 0
Number(undefined) // NaN
Number(null) // 0
parseInt&& Number
parseInt('123a') // 123
Number('123a') // NaN
- 对象
Number({name: "zhang"}) // NaN
Number([1, 2, 3]) // NaN
Number([1]) // 1
转换规则
- 调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数。
- 如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数。
- 如果toString方法返回的是对象,就报错。
String()
- 原始类型值
String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"
- 对象
String({name: "zhang"}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
-
先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数。
-
如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数。
-
如果valueOf方法返回的是对象,报错。
- Boolean()
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false (+0 -0)都返回false
Boolean(NaN) // false
Boolean('') // false
// 其他全返回true
自动转换
- 不同类型的数据互相运算。
123 + 'abc' // "123abc"
- 对非布尔值类型的数据求布尔值
if ('a') {
console.log('hello')
} // "hello"
- 对非数值类型的值使用一元运算符(即+和-)
+ {name: 'zhang'} // NaN
- [1, 2, 3] // NaN
网友评论