前言:只记叙自己不熟悉的知识点,仅供参考。如果写的有什么不妥的地方,望各位前辈指正,不胜感激。
全局对象:
JS可以直接使用,当JS解析器启动的时候,会创建一个新的全局对象,并定义一组初始属性:
1. 全局属性: 如undefined、infinity和NaN
2. 全局函数:如isNaN、parseInt() 和 eval()
3. 构造函数:如Date()、RegExp()、String()、Object()、Array()
4. 全局对象:如Math、JSON
这些初始属性不是保留字,但应该当做保留字来对待。
var global = this;// 定义一个引用全局对象的全局变量
包装对象:
JS对象是一种复合值,他的属性或者已命名值得集合。使用‘.’来引用属性,当属性是一个函数时,成为其的方法。
当对一个字符串、数字或者布尔值左操作其属性的时候:
会创建new出一个对象(被成为 包装对象),当操作完成后,该对象会销毁。
不可变的原始值和可变的对象引用:
值比较:不变,重新产生新的。(原始值)
引用类型:可变,原来的对象。(对象的值)
类型转换:
一些例子:
10 + "object" // "10object"字符串
"7" * "4" // 28 数字
var n = 1 - "x" // NaN(字符串x无法转换为数字)
n + " object" // "NaN object"(NaN转化为字符串)
转换和相等性:
null == undefined // true
"0" == 0 // 比较前字符串转换成数字 true
0 == false // 比较前布尔值转换为数字 true
"0" == false // 之前都转换为数字 true
显示类型转换:
Number("3") // 3
String(fasle) // "false" / false.toString()
Boolean([]) // true
Object(3) // new Number(3)
x+ "" // String(x)
+x // Number(x) equals to x -0
!!x // Boolean(x)
注意:null undefined 不具有toString()方法
toString() 进制转换
var n = 17;
binary_string = n.toString(2);
octal_string = "0" + n.toString(8);
hex_string = "0x" + n.toString(16)
数字转字符串
var n = 123456.789;
//都会四舍五入
//根据小数点后的指定位数 转 字符串
n.toFixed(0); //"123457"
n.toFixed(2); // "123456.79"
n.toFixed(5); // "123456.78900"
//指数法记录
n.toExponential(1); // "1.2e+5"
n.toExponential(3); // "1.235e+5"
//有效数字位,如果少于真数部分的位数用指数表示
n.toPrecision(4); // "1.234e+5"
n.toPrecision(7); // "123456.8"
n.toPrecision(10); // "123456.789"
字符串 转 数字
parseInt 和 parseFloat
他们都会忽略前导空格,和数字后面的内容。 如果第一个非空字符是非法的返回NaN
parseInt(" 123 meters") // 123
parseFloat("0xFF") // 255
parseInt("0.1") // 0
parseInt(".1") // NaN
else
parseInt 可接受第二个参数 表示转换的进制
parseInt("34",2)
对象转化为原始值:
对象转字符串
toString() // 没有这个方法 调用valueof
valueof() // 还是没有 报错
对象转数字
valueof() // 没有这个方法 调用toString
toString() // 还是没有 报错
其他
var now = new Date(); //日期对象
typeof(now +1) // string
typeof(now - 1) // number
now == now.toString() // true
now > (now +1) // true 数字比较
变量声明:
var i;
var num;
var i, num;
var i=0,j=0;
//在给这些变量存入值之前都是undefined
//循环
for(var i = 0 ; i<10; i++) console.log(i);
for(var i=0,j=10; i<10; i++, j++) console.log(i*j);
for(var p in o) console.log(p);
注:重复申明是合法的
变量作用域:
函数体内: 局部变量的优先级大于全局变量
var global = "xx";
function tesy(){
var global = "rr";
return global; // "rr"
}
注:全局变量可以不写var 局部变量一定要写
函数作用域和申明提前:
函数内申明的所有变量对函数体内始终是可见的
函数中声明的所有变量都被"提前"到函数体顶部。然后到var之地对其赋值
如:
var local = "xx";
funtion test(){
console.log(local); // undefined
var local="dsds";
consle.log(local); // dsds
}
equals to :
var local = "xx";
funtion test(){
var local;
console.log(local); // undefined
local="dsds";
consle.log(local); // dsds
}
作为属性的变量
声明一个全局变量,就等于定义了一个全局对象的一个属性。用var申明的一个变量是不可配置的 ,不能被删除。未声明的属性是可配置的(JS自动创建全局对象的属性)
var x = 2;
y = 3;
this z =9;
delete x; //删不掉的
delete this.z; // ok
delete y; // ok
作用域链