js基本语法中容易忽视的几个地方

来源:互联网 发布:反兴奋剂大数据 编辑:程序博客网 时间:2024/06/06 03:26

1. JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六个类别和两个特殊值。

六个类别的数据类型又可以分成两组:原始类型(primitive type)和合成类型(complex type)。RegExp和Date都不是数据类型,只是构造函数而已(Node, Element 以及 HTMLElement 都不是数据类型,就像Array, Date 和 RegExp一样,他们都属于对象(Object)类型)。

原始类型包括三种数据类型。

  • 数值(number)
  • 字符串(string)
  • 布尔值(boolean)

“数值”就是整数和小数(比如1和3.14),“字符串”就是由多个字符组成的文本(比如"Hello World"),“布尔值”则是true(真)和false(假)两个特定值。

合成类型也包括三种数据类型。

  • 对象(object):狭义的对象,否则广义的对象也包括数组和函数
  • 数组(array)
  • 函数(function)

对象和数组是两种不同的数据组合方式,而函数其实是处理数据的方法。JavaScript把函数当成一种数据类型,可以像其他类型的数据一样,进行赋值和传递,这为编程带来了很大的灵活性,体现了JavaScript作为“函数式语言”的本质。

这里需要明确的是,JavaScript的所有数据,都可以视为对象。不仅合成类型的数组和函数属于对象的特例,就连原始类型的数据(数值、字符串、布尔值)也可以用对象方式调用。

除了上面这六个类别,JavaScript还定义了两个特殊值null和undefined。


2. switch语句后面的表达式与case语句后面的表示式(注意是表达式),在比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。


3. JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码(当前作用域)的头部,这就叫做变量提升(hoisting)。Hosting 只提升了声明,没有提升定义。变量提升的原理还是蛮重要的,详情移步:http://blog.csdn.net/shilu89757/article/details/42462023

4. JavaScript的标识名区分大小写,所以undefined和null不同于Undefined和Null(或者其他仅仅大小写不同的词形),后者只是普通的变量名。

5. 如果JavaScript预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。

  • undefined
  • null
  • false
  • 0
  • NaN
  • ""(空字符串)

需要特别注意的是,空数组([])和空对象({})对应的布尔值,都是true。

6.使用分号的场景:(小僧刚入行的时候比较纠结的一点)

分号表示一条语句的结尾。但是,有一些语法结构不需要在语句的结尾添加分号,主要是以下三种情况。

(1)for和while循环

for(;;){} // 没有分号while(true){} // 没有分号

需要注意的是do...while循环是有分号的。

do {a--;} while(a > 0); // 分号不能省略

(2)分支语句:if, switch, try

if (true) {} // 没有分号switch () {} // 没有分号try {} catch {} // 没有分号

(3)函数的声明语句

function f() {} // 没有分号

但是函数表达式仍然要使用分号。

var f = function f() {};

以上三种情况,如果使用了分号,并不会出错。因为,解释引擎会把这个分号解释为空语句。

当然有些情况如果不加分号,就会出现错误:

    如果continue、break、return和throw这四个语句后面,直接跟换行符,则会自动添加分号。这意味着,如果return语句返回的是一个对象的字面量,起首的大括号一定要写在同一行,否则得不到预期结果。

7. 0除以0也会得到NaN;NaN与任何数(包括它自己)的运算,得到的都是NaN;NaN不是一种独立的数据类型,而是一种特殊数值,它的数据类型依然属于Number,使用typeof运算符可以看得很清楚;NaN不等于任何值,包括它本身。判断NaN更可靠的方法是,利用NaN是JavaScript之中唯一不等于自身的值这个特点,进行判断。

8. parseInt如果第一个参数是数值,则会将这个数值先转为10进制,然后再应用第二个参数。如果第一个参数是字符串,则不会将其先转为十进制。

parseInt(010, 10) // 8parseInt(010, 8) // NaNparseInt(020, 10) // 16parseInt(020, 8) // 14
9.delete命令只能删除对象本身的属性,不能删除继承的属性(关于继承参见《面向对象编程》一节)。delete命令也不能删除var命令声明的变量,只能用来删除属性

10.在JavaScript 1.2之后的版本中,布尔操作 a || b 当且仅当a的值是true,或能够转换为true的时候返回a,否则返回b的值.也就是说表达式 a || b的值不是布尔值 if(a || b)是先求表达式的值,再将它的值转换为boolean。


11. 使用数组的forEach方法或者for...in结构进行遍历,空位(例如 [,,,])就会被跳过,但是undefine不会被跳过.

12. 如果两个值不是同一类型,严格相等运算符(===)直接返回false,而相等运算符(==)会将它们转化成同一个类型,再用严格相等运算符进行比较

13.   有关prototype以及call()方法请移步:http://blog.csdn.net/shilu89757/article/details/42462155  和 http://blog.csdn.net/shilu89757/article/details/42462241 ,建议详细看第二篇文章


0 0