null
,undefined
,boolean
,number
,string
,symbol
(es6)。Object
var a = 1; 分配一块内存#001,存放值为1,a存放值1
var b = a; 分配一块内存#002,存放值为1,b存放值1
console.log(a); 1
console.log(b); 1
两个值互不影响
var a = []; 分配一块内存#001,存放值为[], a存放地址#001
var b = a; 将地址#001赋值给b,此时b的地址也是#001,a和b表明同一个地址
a.push(1)
console.log(a); [1]
console.log(b); [1]
同一个地址表明同一个地方,因此会互相影响
复制代码
function test(person) {
person.age = 26 // 这里参数传入的是对象的地址
person = { // 这里从新赋值了,至关于从新分配了地址
name: 'yyy',
age: 30
}
return person
}
const p1 = {
name: 'yck',
age: 25
}
const p2 = test(p1)
console.log(p1) // -> {name: 'yck', age: 25 }
console.log(p2) // -> {name: 'yyy', age: 30 }
复制代码
typeof
对于基本类型,除了 null
均可以显示正确的类型,对于对象没法区分是哪种es6
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof b // b 没有声明,可是还会显示 undefined
复制代码
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
复制代码
对于 null
来讲,虽然它是基本类型,可是会显示 object
算法
typeof null // 'object'
复制代码
instanceof
区分对象instanceof
是经过原型链来判断json
const Person = function() {}
const p1 = new Person()
p1 instanceof Person // true
var str = 'hello world'
str instanceof String // false
var str1 = new String('hello world')
str1 instanceof String // true
复制代码
JS不存在整型,所有按照 IEEE 754 双精度版本(64位)来表示数字 而计算机计算是采用二进制,因此会将十进制先转成2进制计算后再转成十进制,所以计算有时会出现偏差,好比:0.2 + 0.1 = 0.30000000000000004数组
console.log(NaN == NAN);//false
console.log(typeof NaN); //'number'
复制代码
console.log( isNaN(NaN) ); //true
console.log( isNaN(10) ); //false
console.log( isNaN(true) ); //false
复制代码
在 JS 中类型转换只有三种状况,分别是:bash
在条件判断时,undefined, null, false, NaN, '', 0, -0,转为 false,其余全部值都转为 true。闭包
对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来讲,算法逻辑通常来讲以下:app
若是已是原始类型了,那就不须要转换了函数
let a = {
valueOf() {
return 0
},
toString() {
return '1'
},
[Symbol.toPrimitive]() {
return 2
}
}
1 + a // => 3
复制代码
Number():字符串--整数 (能够用于任何类型总体转换)
Number(true)--1
Number(false)-0
Number(null)--0
Number([ ])---0
Number(' ')---0
Number([ 12])---12
Number('100')--100
Number('01000')---1000
转不了的就返回NaN
Number('hello world')----NaN
Number(undefined)----NaN
Number([ 1,2,3])---NaN
Number(json)---NaN json转不了
Number(function(){} ...window等)---NaN
不能转换含有非数字的东西:Number(100px)--NaN
因为Number()函数在转换字符串比较复杂且不够合理,所以处理整数通常用parseInt()
复制代码
parseInt() parseFloat (只针对字符串) parseInt(一个一个的转换,若是第一个不是数字就转成NaN,只能转字符串类型,) parseInt(字符串,几进制(默认10进制))学习
parseInt(100px)---100
parseInt(10px23)--10
parseInt(+100px)--100(忽略+,-,空格,0000)
parseInt(0100)---100
parseInt(12.2元)--12
parseInt('')--NaN
parseFloat(只认识第1个小数点)
parseFloat(12.32元)--12.32
parseFloat(12.3.2元)--12.3
if(parseInt(num)==parseFloat(num)) 说明num是整数
复制代码
1 + '1' // '11'
true + true // 2
4 + [1,2,3] // "41,2,3"
复制代码
另外对于加法还须要注意这个表达式 'a' + + 'b'ui
'a' + + 'b' // -> "aNaN"
复制代码
由于 + 'b' 等于 NaN,因此结果为 "aNaN",你可能也会在一些代码中看到过 + '1' 的形式来快速获取 number 类型。
那么对于除了加法的运算符来讲,只要其中一方是数字,那么另外一方就会被转为数字
4 * '3' // 12
4 * [] // 0
4 * [1, 2] // NaN
复制代码
若是是对象,就经过 toPrimitive 转换对象 若是是字符串,就经过 unicode 字符索引来比较
let a = {
valueOf() {
return 0
},
toString() {
return '1'
}
}
a > -1 // true
复制代码
在以上代码中,由于 a 是对象,因此会经过 valueOf 转换为原始类型再比较值。
Array
push():在末尾添加1项,并返回新数组的长度
pop(); 从末尾删除1项,并返回删除的那一项
shift(); 从前面删除1项,并返回删除的那一项
unshift(); 从前面增长1项,并返回新数组的长度
复制代码
function compare(v1,v2){
return v2-v1;
}
var value = [1,3,4,0,2];
value.sort(compare)
复制代码
var num = [1,2,3,4,5];
num.indexOf(4); //3
num.lastIndexOf(4); //1
复制代码
var num = [1,2,3,4,5];
var result = num.reduce (function(prev,cur,index,array){return prev+cur;} ); 返回的是每项执行结果
alert(result);//15
复制代码
length:长度
var str = 'hello ';
console.log(str.charAt(0)); // h 返回单个字符
console.log(str.charCodeAt(1)); //101 返回字符编码
console.log(str[0]); //h 可直接经过下标
console.log(str.concat('liujingyi'));//hello liujingyi
console.log(str.concat('liu',' jing'));//hello liu jing
console.log(str+'ljy'); //hello ljy
复制代码
var str = 'abjcdefj';
console.log(str.slice(2)); //jcdefj' 开始位置,结束位置 第二个参数默认到最后 console.log(str.substring(2)); //jcdefj' 开始位置,结束位置 第二个参数默认到最后
console.log(str.substr(2)); //jcdefj' 开始位置,返回的字符个数 第二个参数默认到最后 console.log(str.slice(2,5)); //jcd console.log(str.substring(2,5));//jcd console.log(str.substr(2,5)); //jcdef 复制代码
var text = "cat,bat,sat,fat";
var result1 = text.match('at');
var result2 = text.match(/at/);
console.log(result1); //["at", index: 1, input: "cat,bat,sat,fat"]
console.log(result2); //["at", index: 1, input: "cat,bat,sat,fat"]
复制代码
var text = "cat,bat,sat,fat";
var result1 = text.search('at');
var result2 = text.search(/at/);
alert(result1); //1
alert(result2); //1
复制代码
var text = "cat,bat,sat,fat";
var result = text.replace("at","ond");
alert(result); //"cond,bat,sat,fat"
var text = "cat,bat,sat,fat";
var result = text.replace(/at/g,"ond");
alert(result); //"cond,bond,sond,fond"
复制代码
var text = "cat,red,dog";
var result1 = text.split(',');// ["cat", "red", "dog"]
var result2 = text.split(); // ["cat,red,dog"]
var result3 = text.split(',',2); // ["cat", "red"]
复制代码
var text = "dog";
var result1 = text.localeCompare('dog');//0
var result2 = text.localeCompare('cat'); // 1
fromCharCode():传入编码,返回字符串
var result1 = String.fromCharCode(104,101,108,108,111); //hello
substr 参数:截取的起始位置 和长度(若是省略截取到最后)
var str="Hello world!";
var n=str.substr(2,3)
n 输出结果:
llo
复制代码
<script>
var str="Hello world!";
document.write(str.substring(3)+"<br>");
document.write(str.substring(3,7));
</script>
以上代码输出结果:
lo world!
lo w
复制代码
Date对象
var date = new Date();
var year = date.getFullYear();
var month = end(date.getMonth()+1);
var dates = end(date.getDate());
var hours = end(date.getHours()+1);
var minutes = end(date.getMinutes()+1);
var seconds = end(date.getSeconds()+1);
var dayList=['星期日','星期一','星期三','星期四','星期五','星期六'];
var day = dayList[date.getDay()];
var time = year+':'+month+':'+dates+':'+hours+':'+minutes+':'+seconds+':'+day;
console.log(time);
function end(time){
return time<10?'0'+time:time;
}
复制代码
每一个函数都有一个 prototype 属性,存放constructor(建立该函数的构造函数) 和 __proto__
每一个对象都有__proto__
属性,指向了建立该对象的构造函数的原型。其实这个属性指向了 [[prototype]],可是 [[prototype]] 是内部属性,咱们并不能访问到,因此使用 _proto_
来访问。
对象能够经过 __proto__
来寻找上一层的属性,__proto__
将对象链接起来组成了原型链。
function Fun() {
}
Fun.prototype = {
constructor: f Func(),
__proto__: Object
}
Object.prototype = {
constructor: f Object()
}
var a = new Func()
a.__proto__ 指向Fun.prototype
Fun.prototype.__proto__指向Object.prototype
复制代码
function create() {
// 建立一个空的对象
let obj = new Object()
// 得到构造函数
let Con = [].shift.call(arguments)
// 连接到原型
obj.__proto__ = Con.prototype
// 绑定 this,执行构造函数
let result = Con.apply(obj, arguments)
// 确保 new 出来的是个对象
return typeof result === 'object' ? result : obj
}
复制代码
一个函数嵌套另外一个函数的时候,子函数能够访问到外部函数的变量,此时就造成了一个闭包,外部函数的变量不会被销毁。
使用闭包的同时比较容易造成循环引用,若是闭包的做用域链中保存着一些 DOM 节点,这时候就有可能形成内存泄露。 若是要解决循环引用带来的内存泄露问题,咱们只须要把循环引用中的变量设为 null便可。