《JavaScript权威指南第六版》学习笔记-类型、值和变量

第三章、类型、值和变量

JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type).
原始类型包括数字、字符串和布尔值
两个特殊的原始值null(空)和undefined(未定义)
对象是属性(property)的集合,每个属性都是由"名/值对"(值可以是原始值)
普通的JavaScript对象是"命名值"的无序集合——数组(arry),表示带编号的值的有序集合
另一种特殊对象函数

数字

JavaScript不区分整数值和浮点数值
1.整型直接量
2.浮点型直接量
3.JavaScript中的算术运算
加、减、乘、除、求余
复杂运算符

4.二进制浮点数和四舍五入错误
5.日期和时间
JavaScript语言核心包括Date()构造函数

var then=new Date(2017,6,2);  //2017年7月2日
var later=new Date(2017,6,2,17,10,30); //同一天,当地时间5:10:30pm
var now=new Date();  //当前日期和时间
var elapsed=now - then;  //日期减法,计算时间间隔的毫秒数
later.getFullYear();  //=>2017
later.getMonth();   //=>6:从0开始计数的月份
later.getDate();     //=>2:从1开始计数的天数
later.getDay();     //=>5:得到星期几
later.getHours();    //=>当地时间:15
later.getUTCHours();  // 使用UTC表示小时的时间,基于时区复制代码
文本

字符串(string)是一组由16位值组成的不可变的有序序列
JavaScript通过字符串类型来表示文本
1.字符串直接量
在JavaScript程序中的字符串直接量,是由单引号或双引号括起来的字符序列
2.转义字符
3.字符串的使用
"+ " 字符串的拼接

var s="hello world"   //定义一个字符串
s.charAt(0)      //=>"h":第一个字符
s.chartAt(s.length-1)      //=>"d":最后一个字符
s.substing(1,4)         //=>"ell":第2~4个字符
s.slice(-3)       //=>"rld":最后三个字符
s.indexOf("l")       //=>2:字符l首次出现的位置
s.lastIndexOf("l")   //=>10:字符l最后一次出现的位置
s.indexOf("l",3)    //=>3:在位置3及之后首次出现字符l的位置
s.split(", ")    //=>["hello","world"]分割成子串
s.replace("h","H")  //=>"Hello,world":全文字符替换
s.toUpperCase()     //=>"HELLO,WORLD"复制代码

4.模式匹配
JavaScript定义了RegExp()构造函数,用来创建表示文本匹配模式的对象。
正则表达式,JavaScript采用Perl中的正则表达式语法

布尔值

布尔值指代真或假、开或关、是或否。这个类型只有两个值,保留字true和false
任意JavaScript的值都可以转化为布尔值。下面这些值会被转换为false:

undefined
null
0
-0
NaN
""  //空字符串复制代码

运算符:&& || !

null 和 undefined

null 空值,对null执行typeof预算,结果返回字符串"object"。它可以表示数字、字符串和对象是"无值"的
undefinde更深层次的"空值",对undefined执行typeof预算,结果返回字符串"undefined"。它是变量的一种取值,表明变量没有初始化

全局对象(global object)
  • 全局属性,比如undefined,Infinity和NaN
  • 全局函数,比如isNaN(),parseInt()和eval()
  • 构造函数,比如Date(),RegExp(),String(),Object()和Array()
  • 全局对象,比如Math和JSON
包装对象

JavaScript对象是一种复合值:它是属性或已命名值的集合。
字符串eg:

var str='hello world';
str.substring(str.indexOf(" "),str.length)   //=>" world"复制代码

只要引用了字符串str的屬性,JavaScript就会将字符串值通过调用new String(str)的方式转换为对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会销毁
null和undefined没有包装对象,访问它们的属性会造成一个类型错误

不可变的原始值和可变的对象引用

1.JavaScript的原始值(undefined,null,布尔值,数字和字符串)与对象(包括数组和函数)有着根本区别。
2.原始值是不可更改的;原始值的比较是值的比较;
3.对象的比较并非值的比较;两个单独的对象永不相等

类型转换

JavaScript将根据需要自行转换类型

10 + "objects"   //=>"10 objects"数字10转换为字符串
"7" * "4"   //=>28:两个字符串均转换为数字
var n = 1 - "x";   //=>NaN:字符串"x"无法转换为数字
n + "objects";   //=>"NaN objects":NaN转换为字符串"NaN"复制代码

2.true转换为1,false转换为0
3.原始值通过调用String(),Number()或Boolean()构造函数,转换为它们各自的包装对象
4.转换和相等性
(1)."=="相等运算符也随相等的含义灵活多变,如下这些比较结果均是true:

null == undefined;   //这两值被认为相等
"0"  == 0      //在比较之前字符串转换成数字
0 == false  //在比较之前布尔值转换为数字
"0" == false  //在比较之前字符串和布尔值都转换为数字复制代码

5.显式类型转换
(1).最简单的方法是使用Boolean(),String(),Number()或Object()函数

Number("3");   //=>3
String(false);  //=>"false" 或使用  false.toString()
Boolean([]);    //=>true
Object(3);   //=>new Number(3)复制代码

除了null或undefined之外的任何值都具有toString方法
6.隐式类型转换

x + ""  //等价于String(x)
+x   //等价于Number(x).也可以写成x-0
!!x  //等价于Boolean(x).注意是双叹号复制代码

7.对象转换为原始值
所有的对象继承了两个转换方法。toString()和valueOf()
1.toString() 对象到字符串

[1,2,3].toString();     //=>"1,2,3"   将每个数组元素转换为字符串
(function(x) {f(x);}).toString();     //=>"function(x){\n f(x); \n}"    这个函数的实现定义的表示方式
/\d+/g.toString();                   //=>"/\\d+/g"    将RegExp对象转换为表示正则表达式直接量的字符
new Date(2017,6,9).toString();         //=>"Sun Jul 09 2017 00:00:00 GMT+0800 (中国标准时间)"
({x:1,y:2}).toString();          //=>"[object Object]"复制代码

2.valueOf() 对象到数字
eg1:

var d = new Date(2017,6,9);
d.valueOf();   //=>1499529600000复制代码

eg2:

var d = new Date();   //创建一个日期对象
typeof(d + 1);    //=>"string":"+"将日期转换为字符串
typeof(d - 1);     //=>"number":"-"使用对象到数字的转换
d == d.toString()     //=>true:隐式的和显示的字符串转换
now > (now - 1)     //=>true:">"将日期转换为数字复制代码
变量声明

1.在JavaScript中,使用一个变量之前应当先声明
2.如果未在var声明语句中给变量指定初始值,那么虽然声明了这个变量,但在给它存入一个值之前,它的初始值就是undefined
3.在for和for-in循环中同样可以使用var语句
4.重复的声明和遗漏的声明

变量作用域

1.一个变量的作用域(scope)是程序源代码中定义这个变量的区域
2.全局变量拥有全局作用域
3.局部变量,函数内声明的变量只在函数体内有定义
4.在函数体内,局部变量的优先级高于同名的全局变量

var scope = "global";   //声明一个全局变量
function checkscope(){
  var scope = "local";     //声明一个同名的局部变量
  return scope;     //返回局部变量的值,而不是全局变量的值
}
checkscope();复制代码

5.函数定义是可以嵌套的

var scope = "global scope";  //全局变量
function checkscope(){
  var scope = "local scope";  //局部变量
  function nested(){
    var scope = "nested scope";   //嵌套作用域内的局部变量
    return scope;   //返回当前作用域内的值
  }
  return nested();
}
checkscope();复制代码

6.函数作用域和声明提前
(1).同一个作用域内

function test(o){
  var i = 0;   // i 在整个函数体内均是有定义的
  if(typeof o == "object"){
    var j = 0;     // j在函数体内是有定义的,不仅仅是在这个代码段内
    for(var k = 0;k < 10;k++){            // k 在函数体内是有定义的,不仅仅是在循环内
      console.log(k);      //输出数字0~9
    }
  }
}     复制代码

(2).JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。
声明提前(hoisting)

var scope = "global";
function f(){
  cocnsole.log(scope);    //输出"undefined",而不是"global"
  var scope = "local";    //变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
  console.log(scope);     //输出"local"
}
f();

真实转换:
function f(){
  var scope;            //在函数顶部声明了局部变量
  console.log(scope);      //变量存在,但其值是"undefined"
  scope = "local";       //这里将其初始化并赋值
  console.log(scope);      //这里它具有了我们所期望的值
}复制代码

将变量声明放在函数体顶部
7.作为属性的变量

var truevar = 1; //声明了一个不可删除的全局变量
fakevar = 2;    //创建全局对象的一个可删除的属性
this.fakevar2 = 3; //同上
delete truevar;    //=>false:变量并没有被删除
delete fakevar;    //=>true:变量被删除
delete this.fakevar2;   //=>true:变量被删除复制代码

JavaScript全局变量是全局对象的属性。
8.作用域链
(1).在JavaScript的最顶层代码中(也就是不包含在任何函数定义内的代码),作用域链由一个全局对象组成。
(2).在不包含嵌套的函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。
(3).在一个嵌套的函数体内,作用域链上至少有三个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值