1 . JavaScript 严格区分大小写 关键字,变量,函数名和所有的标示符都必须严格区分大小写。
比如:”while” 不能写成“While” 或者“WHILE”
2 . JavaScript 会忽略程序中标识之间的空格。由于 编写代码习惯, 代码样式,换行都同,可以提高代码的可读性。
除了识别普通空格字符(\u0020)还可识别其他表示空格字符:水平制表符(u\0009),垂直制表符(\u000B),换页符( \u000C),不中断空白(\u00A0)等等。
3 . 二进制浮点数和四舍五入错误,JavaScript 通过浮点数形式只能表示其中有限个数,也就是说只能表示真实值的一个近似表示,采用IEEE-754浮点法(具体是啥我也不清楚,总是几乎所有的现代编程语言都采用了),这是一种二进制表示法,可以精确表示1/2,1/8,1/1024,但无法精确的表示我们常用的小数。
比如:
var x =.3-.2;
var y =.2-.1;
x==y //false :两值不相等
x==.1 //false
y==.1 //true
这是值得注意的,在任何用二进制浮点数的编程语言中都会有这个问题。
4 . 转义字符: \o NUL字符, \b 退格符,\t 水平制表符,\n换行符,\f 换页符,\v 垂直制表符,\r 回车 ,\’ 单引号 ,\”双引号。
5 . 不可变的原始值和可变的对象引用: 原始值和对象有着根本地区别,原始值不可修改,任何地方都不可。
var s ="hellp";
s.toUpperCase();
s // s= "hello" 原始值并未改变
对象的值是可修改的:
var a ={x:1};//定义对象
a.x=2;//修改对象的属性值
a.y=3;// 更改对象,新增一个新属性
var b=[1,2,3];//数组是可修改的
b[0] =0;
b[3] =4;
对象比较并非值的比较 两个对象包含相同的属性和相同属性值,但它们也是不相等的。
var a={x:1}, b={x:1};
a===p //false单独对象永不等
var a= [],b = [];
a===b //false 单独数组永不等
当且仅当引用一个对象时才相等:
var a=[];
var b=a;
b[0]=1;
a===b//true 引用相同
6 .变量作用域
在函数体内,局部变量的优先级高于同名的全局变量,若果函数内声明的一个局部变量或者参数中带有的变量和全局变量重名,name全局变量就被局部变量所遮盖。
var code= "abcd";
function checkcode(){
var code ="bcd";//同名的局部变量
rerurn code;//返回区部变量的值
}
checkcode();// "bcd"
全局变量编写时可以不写var,但声明局部变量是必须使用var语句。
code= "abcd";
function checkcode2(){
code ="bcd";//此时已经修改了全局变量
mycode ="bcd";
rerurn [code,mycode];//返回两个值
}
checkcode2();// ["bcd","bcd"]:产生了副作用
code //"bcd" 全局变量被修改
mycode// "bcd":全局命名空间搞乱了
JavaScript 的函数作用域是指函数内声明所有的变量在函数体内始终是可见的。这意味着变量在声明之前已经可用。不过这也就有了特别之处:
var code="abc";
function f(){
console.log(code);//输出“undefined” 不是“abc”
var code ="abcd";//变量在这里初始赋值,但变量本身在函数体内任何地方均有定义
console.log(code);//输出“abcd”
}
你会认为第一行输出 “abc” 因为代码还没执行到Var语句声明局部变量地方。其实函数作用域提醒,局部变量在整个函数体内始终有定义,所以函数体内的局部变量遮住了同名全局变量。只有程序执行到了var语句的时候,局部变量才会被真正赋值。
上述过程等价:将函数内的变量声明提前至函数体顶部,同事变量初始化留在了原来的位置:
function f(){
var code;
console.log(code);//变量存在但值是“undefined”
var code ="abcd";//变量在这里初始赋值
console.log(code);//输出“abcd” 这里具有了我们所期望的值
}
所以局部变量尽量在函数体前的位置。减少不必要的错误。这也是一种好的编程习惯,放在函数体顶部。清晰反应了真实的变量作用域。