javascript中的原始类型和对象类型(基本类型和引用类型)
//本书是指:javascript权威指南 
 
//以下内容摘记时间为:2013.7.27
 
计算机程序运行时需要对值(value)(比如:3.14或者“hello”)进行操作。
能够表示并操作的值的类型称作数据类型(type)。
当程序需要将值保存起来以备将来使用,便将其赋值给一个变量(variable)。
 

Js的数据类型分为两类:

 
原始类型 和对象类型(基本类型和引用类型,来自高程的说法
 
原始类型包括:字符串,布尔值,数字。(null和undefined是两个特殊的原始值,代表了各自特殊类型的唯一成员)
 
对象是属性的集合(不是属性和方法的集合吗?),每个属性都由“名/值对”(值可以是原始值,也可以是对象)构成。全局对象是比较特殊的对象。
对象类型包括:普通对象(“命名值”的无序集合),特殊对象-数组(带编号值的有序集合),函数。
 
备注:在其他书中看到对象是属性和方法的集合。但是在这本书中p32说对象是属性的集合,属性可以是对象,对象包括函数,函数即方法,所以对象是属性和方法的集合。
在p46 页中说属性值用“.”来引用,当属性值是一个函数的时候,称其为方法通过o.m()来调用对象o中的方法。
 
全局对象(globle object)初始属性:
  • 全局属性:比如undefined,Infinity和NaN
  • 全局函数:比如isNaN(),parseInt(),eval()(eval()这个函数在用元素的js代码接收json数据的时候比较好用)
  • 构造函数:比如Date(),RegExp(),String(),Object()和Array()
  • 全局对象:比如Math和JSON
在代码对顶端,不在任何函数内的JS代码,可以使用JS关键字this来引用全局对象:
 
var global = this;//定义一个引用全局对象的全局变量。
 
到客户端JS中,window对象充当了全局对象,有一个引用自身的window属性,替代this来引用全局对象。
window对象定义了核心的全局属性,也定义了一些额外的全局属性。
 
包装对象:存取字符串,数字,布尔值的属性时创建(用String(),Number(),Boolean()构造函数来创建)的临时对象称作包装对象。
 
不可变的原始值和可变的对象引用
 
在将一个赋给变量时,解析器必须确定这个值是引用类型还是基本类型。
//
基本数据类型是按值访问的,因为可以操作保存在变量中的实际值。
引用类型的值是保存在内存中的对象。JS不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象,为此,应用类型的值是按照引用访问的。
备注:当复制保存着对象的某个变量时,操作的是对象的引用,但是为对象添加属性时,操作的是实际的对象。
//(来自高程的说法
 
下面是定义和复制基本类型和引用类型的具体实现
 
基本类型变量初始化,复制。
var a = 5;
var b = a;
b = 10;
第一句中a保持的值是5,第二句使用a来初始化b,此时b的值也是5,但是a和b是完全独立的,b中的5只是a中的一个副本。所以当第三句中把10赋给b时,b的值是10,但是a的值依然是5.
下图展示了复制基本类型的过程:
引用类型变量初始化,复制。
var obj1 = new Object();
var obj2 = new Object();
obj1.name = "Prince";
obj1.age = 25;
obj2.name = "Xiaobao";
var obj3 = obj1;
obj3.name = "Xiaoyin";
alert(obj1.name);//Xiaoyin
首先obj1中保存了对象的一个实例,obj2保存了对象的另一个实例。分别初始化obj1和obj2。var obj3 = obj1;说明obj1复制给了obj3,(此时和基本类型复制不同,在引用类型中值保存的是地址,而非具体值,所以复制之后不是简单的生成副本)他们都指向同一个对象的地址。所以当obj3.name = "Xiaoyin";时其实是修改了堆内存中他们共同指向的哪个对象中的属性值,所以当alert(obj1.name);弹出的值是我们家Xiaoyin。
下图展示了引用类型复制的过程:
类型转换表
 
字符串
数字
布尔值
对象
undefined( 是指未初始化,而不是未定义,见 备注 1)
“undefined”
NaN

var s;
alert(s+5);// NaN
false
throws TypeError
null
“unll”
0
false
throws TypeError
“”( 空字符串)
 
0
false
new String(“”)
“1.3”( 非空,数字)
 
1.3
true
new String(“1.3”)
“dada”( 非空,非数字 )
 
NaN
true
new String(“dada”)
0
“0”
 
false
new Number(0)
-0
“0”
 
false
new Number(-0)
NaN
“NaN”
 
false
new Number(NaN)
Infinity
“Infinity”
 
true
new Number(Infinity)
- Infinity
“-Infinity”
 
true
new Number(-Infinity)
1( 无穷大,非0)
“1”
 
true
new Number(1)
true
“true”
1
 
New Boolean(true)
false
“false”
0
 
New Boolean(false)
{}( 任意对象)
参考 备注2
参考 备注2
true
 
[]( 任意数组)
“”
0
true
 
[9](1 个数组元素)
“9”
9
true
 
[‘a’]( 其他数组)
使用 join() 方法
NaN
true
 
function(){}( 任意函数)
参考 备注2
NaN
true
 
 
:在高程p25 页中建议我们显示的初始化,当用 typeof时,弹出undefined 错误可以知道是因为没有被声明,而不是尚未初始化。但直接使用变量的时候如果是未定义会保存,为初始化则是 undefined。
var message;
//var age;
alert(message);//” undefined”
alert(age);//报错
alert(typeof message); //” undefined”
alert(typeof age); //” undefined”
 
备注2:详细内容在本书3.8.3节。
对象转换为原始值有三种情况:
1.转换成 布尔值 都为真
2.转换成字符串
如果对象有toString()方法,先去调用toString()方法,返回原始值,在转换成字符串;
如果没有toString()方法,那么去调用valueOf()方法;
否则报出一个类型异常 的错误。
3.转换成数字
先调用valueOf()方法,返回数字;
如果不存在valueOf()方法,就去调用toString()方法;
否则报出一个类型异常 的错误。
 
显式类型转换
 
最简单的方法是使用Boolean(),Number(),String(),Object()函数。
在将数字转换为字符串的时候还提供了更加个性化的函数:
toString():可以指定转换的基数(2进制到26进制)
toFixed():不使用科学计数法,可以指定小数点后面的位数
toExponential():使用科学计数法,数字表示小数点后面的位数
toPrecision():使用科学计数法,数字表示总的位数
将字符串转换成数字:
parseInt():只解析整数,可以指定转换的基数
parseFloat():可以解析整数和浮点数
 
小例子:
var s = "1111";
alert(s+5);
alert(Number(s)+5);
 
因为“+”的操作数有一个是字符串,它会把另外一个操作数也当作字符串来处理,所以第一个alert执行的是字符串拼接,可以通过显示类型转换把字符串转换成数字再来操作。
 
变量作用域来自高程p73的说法
 
1.js中没有块级作用域的概念。在for循环中定义的变量在for循环结束后还是存在与循环外部的作用域中。
2.执行环境:定义了变量和函数有权访问的其他数据,决定了他们各自的行为。每个函数都有一个执行环境,当执行流进入一个函数后,函数的环境被推进一个环境栈中,函数执行完后,栈将其环境弹出。
3.作用域链:保证执行环境有权访问所有的变量和函数的有序访问。作用域链的前端始终指向当前执行的代码所在环境的变量对象。下一个变量对象是来自包含环境。全局执行环境的变量对象始终都是作用域链中的最后一个对象。
4.内部环境可以通过作用域访问所有外部环境,但是外部环境不能访问内部环境中的任何变量和函数。
 
例子:
var color ="blue";
function getColor(){
     //var color = "red";
     return color;
}
alert(getColor()); //"blue"
如果把上面例子中红色加粗的句子//去掉,那输出的结果就是"red"。
 
例子:(之前在博客园博问中问的一个问题,在这里得到了解答,但是php中局部变量和全局变量是不公用的)
var scope = "global";
function f(){
     console.log(scope);//undefined
     var scope = "local";
     console.log(scope);//local
}
 
分析:由于函数作用域的特性,局部变量在整个函数体内始终是有定义的,函数体内局部变量遮盖了同名的全局变量。但是只有程序执行到var语句的时候,局部变量才被真正赋值。所以上面的过程等价于:将函数内的变量声明“提前”至函数体顶部,变量初始化留在原来的位置:
var scope = "global";
function f(){
     varscope;
     console.log(scope);//undefined
     scope = "local";
     console.log(scope);//local
}

【笔记】javascript权威指南-第三章-类型,值和变量的更多相关文章

  1. JavaScript权威指南第03章 类型、值和变量(1)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/huangbin10025/article/details/27953481 类型.值和变量 数据类型 ...

  2. JavaScript权威指南--第3章 类型、值和变量

    在编程语言中,能够表示并操作的值(value)的类型称作数据类型(type).使用变量来储存值.JavaScript中数据类型有两种:原始类型(primitive type/基本数据类型)和对象类型( ...

  3. javascript权威指南第11章 DOM扩展

    //javascript 权威指南 第三版 第11章 DOM扩展 //取得body元素 var body = document.querySelector("body"); //取 ...

  4. PADSPCB权威指南-第三章 预处理(部分)(原创)

    PADSPCB权威指南-第三章(部分)豆丁地址:http://www.docin.com/p-707132066.html

  5. 【笔记】javascript权威指南-第六章-对象

    对象 //本书是指:javascript权威指南    //以下内容摘记时间为:2013.7.28 对象的定义: 1.对象是一种复合值:将很多值(原始值或者对象)聚合在一起,可以通过名字访问这些值. ...

  6. javascript权威指南第20章 JSON

    //20.1 语法 //JAVASCRIPT 是对JSON数据支持的. //JSON 可以申明三种类型的值 简单值("hello world") 对象({"name&qu ...

  7. JavaScript权威指南第02章 词法结构

    词法结构 2.1字符集 JavaScript 是Unicode字符集编写,差点儿支持地球上全部的语言. 2.1.1区分大写和小写 javascript是区分大写和小写的语言. 2.1.2 空格.换行符 ...

  8. javascript权威指南第22章高级技巧

    HTML <!DOCTYPE html> <html> <head> </head> <body> <div style=" ...

  9. javascript权威指南第16章 HTML5脚本编程

    <!DOCTYPE html> <html> <head> <script type="text/javascript" src=&quo ...

随机推荐

  1. saltstack系列2之zabbix-agent自动化部署

    实施前提条件 zabbix-agent通过编译安装的,打成tar包,并且自己先配好master的ip等等之类的配置在/etc下,然后我们后面只需要修改一个Hostname这个配置项即可.. salts ...

  2. 基于thinkphp的API日志

    1.thinkphp日志 thinkphp的日志处理工作是由系统自动进行的 在开启日志记录的情况下,会记录下允许的日志级别的所有日志信息 系统的日志记录由核心的Think\Log类及其驱动完成,提供了 ...

  3. Redis集群版在Java中的应用

    1.配置redis集群 <?xml version="1.0" encoding="UTF-8"?> <redisCluster> &l ...

  4. linux中通过awk进行文本的对齐格式化处理?awk printf左对齐?

    需求描述: 今天在对一个从excel文件中粘出来的内容进行整理的时候,发现格式很乱,就想用awk工具格式化一下,在此记录一下. 操作过程: 1.从excel中复制出来的内容 job_name    j ...

  5. webpack流程图

  6. python类和模块区别,python命名空间

    在python中,类可以提供模块级别之下的命名空间. 如果一个模块写很多函数,某些函数之间共同完成一组功能,用类会看起来更清晰,在调用时候也会更好,对于ide补全有更小范围的限定提示. 类提供 继承 ...

  7. Git初级使用教程

    什么是 Git? Git 是一款免费的.开源的.分布式的版本控制系统.旨在快速高效地处理无论规模大小的任何软件工程. 每一个 Git克隆 都是一个完整的文件库,含有全部历史记录和修订追踪能力,不依赖于 ...

  8. 【转载】springboot + swagger

    注:本文参考自 http://www.jianshu.com/p/0465a2b837d2 https://www.cnblogs.com/java-zhao/p/5348113.html swagg ...

  9. json_encode让URL内容斜杠/不转义

    同事在开发接口的时候根据接口提示要求传参一个字符串json,该json格式中有URL数组,按照json_encode编码后总发现 http://变成了 http:\/\/  .URL的斜杠自动的被转义 ...

  10. AngularJS的初步学习(1)

    AngularJS 是一个Javascript框架.它可通过 <script> 标签添加到 HTML 页面.AngularJS 通过 指令 扩展了 HTML,且通过 表达式绑定数据到 HT ...