JavaScript使用的是松散类型变量,所谓松散类型变量指的是变量只是作为一个存储位置的占位符,本身不具备任何决定变量类型的功能。变量具体是什么类型由变量的值直接决定。
JavaScript只支持下面的六种数据类型Undefined/Null/Boolean/Number/String/Object。因为JavaScript本身是一种动态语言,参数使用的也是松散类型参数,所以提供了typeof关键字来判断当前的变量类型,随后的返回值在下面进行详细的介绍。
- undefined
如果一个变量被定义之后却没有赋值,那么初始的值就会被设定成为Undefined
- boolean
布尔值,只有true/false两种取值情况。
- string
字符串类型,引号或者是双引号内的所有文本内容
- number
JavaScript只支持一种类型的数值,可以带小数点
- object
如果这个参数是个对象或者Null,在JavaScript中对象是一个无序键值对
- function
如果这个值是一个参数,在JavaScript中,其实函数也是一个对象
JavaScript的函数参数和其他语言的不同,不会使用声明函数是填写的命名参数作为函数签名的一部分限制函数的使用。所以函数使用时传入参数的个数和定义函数是填写的命名参数的个数并不是相等的。这是因为函数的参数实际上都是保存在函数内部的一个arguments的类数组结构中,通过arguments.lenght可以知道传入参数的数量,通过下标可以访问里面对应的某个参数。为了保证函数代码的健壮性,可能需要在执行函数的操作代码之前就要去对函数的参数进行验证。
这里用运行环境进行作用域的讨论。在JavaScript中运行环境只有可能是下面的三种类型:全局环境/函数局部环境/try或with块环境。作用域链是将当前运行环境置于栈顶通过包含关系形成的一个栈,当从目前运行环境中退出时,对应的运行环境也会从作用域链中推出。在使用某个变量之前会从作用域链最前端开始搜索该变量直到找到对应的定义,所以以来这个搜索的过程,被包含的运行环境中定义的变量会覆盖掉包含运行环境中定义的变量。在上面列举运行环境的时候注意到JavaScript除了最后两个特殊语句之外是没有块运行环境的,在块运行环境中定义的变量在执行完成该环境之后还能够继续访问而没有被销毁。
在函数的内部提供了的caller/arguments.callee属性用来解决函数的松耦合问题。同时可以使用函数对象的apply()/call()函数来扩充函数的运行环境。
引用变量实际是对象实例,谈及到对象自然而然也就会涉及到类的讨论。JavaScript虽然从技术上来说是支持面向对象概念的,但是其本身并不具备类和接口之类的性质。在JavaScript中对象实际上是一组无序的属性值,创建一个引用变量有下面的两种方式。
// 方式1
var person = new Object();
person.name = "name";
person.sayHi = function() {
console.log(this.name, 'Hi!');
}
// 方式2
var person = {
name:"name",
sayHi:function() {
console.log(this.name, ' Hi!');
}
}第一种方式中Object是JavaScript几个预定义对象中的一个,利用构造函数创建完对象之后可以再给对象添加自定义的属性;第二种方式是采用字面常量的方式来创建
构造函数定义的方式和定义普通的函数没有什么区别,只是在使用new操作符调用构造函数的时候函数名首字母需要大写用来区别普通函数。构造函数在执行的时候进行了下面的这些操作。
- 创建一个新的对象
- 将构造函数的作用域赋给新对象
- 执行构造函数中的代码
- 返回新对象