初学杂烩——第三章

数据类型:原始类型|对象类型 概念:能够表示并操作的值的类型称之为数据类型;变量是一个值的符号名称;

原始类型

  数字,字符串,布尔值,null(空),undefined(未定义)

对象类型真值

  对象(属性的集合)->特殊对象:全局对象,数组类,函数类,日期类,正则类,错误类  /*类相当于对象类型的子类型*/

           ->普通对象:"命名值"的无序集合

原始值和对象之间的区别

  1.原始值是不可更改的;对象的属性,方法都是可更改的。

  2.原始值的比较是值的比较;对象的比较并非值的比较,而是引用的比较。只有在引用同一个对象时,它们才相等。

  3.对象的比较由于其独特的结构,需要自定义equalArrays(a,b)函数判断是否相等

内存管理:js解释器有自己的内存管理机制,所以不用考虑内存的回收问题。

面向对象:数据类型本身可以定义方法来使用值。如:数组a对其元素进行排序,只需:a.sort()即可。/*原始类型除null和undefined都是有方法的值*/

变量:无类型,可以被赋予任何类型,也可以重新被赋予任何类型。关键字 var

作用域:全局和局部变量

数字:js所有数字均用浮点数值表示(64位浮点格式);数组索引是基于32位整数

  数字直接量:当一个数字直接出现在js程序中时,我们称之为数字直接量,对应的有整型直接量以及浮点型直接量

    整型直接量:十进制整数(0~10),十六进制值(以"0x"或"0X"为前缀,如0xff),八进制部分支持(以"0"为前缀),但是不建议使用

    浮点型直接量:3.14, .333, 6.02e23, 1.47E-32

Math:

  Math.sqrt()

  Math.pow(x,y);x的y次幂,如果y是1/3 则变成了x的立方根

  Math.round(x);x的四舍五入(对浮点型)

  Math.ceil(x);向上求整(大于等于)

  Math.floor(x);向下求整(小于等于)

  Math.abs(x);x的绝对值

  Math.max(a,b,c);返回最大值,对应min返回最小值

  Math.random();生成一个大于等于0小于1.0的伪随机数。/*非常常用的一个函数*/

  Math.PI;圆周率

  Math.E;自然对数的底数

  Math.sin(0),另外还有cos,atan等三角函数

  Math.log(10);10 的自然对数

  Math.log(100)/Math.LN10;以10为底100的对数

  Math.log(512)/Math.LN2;以2为底521的对数

  Math.exp(3);e的三次幂

算术运算错误

  溢出:Infinity(无穷大),-Infinity(无穷小)

  下溢:当运算结果无限接近于零并比Javascript能表示的最小值还小的时候发生的一种情形。"零"或者"负零" /*负零和正零值是相等的,只有在做为除数时不一样。*/

  被除零:Infinity(无穷大),-Infinity(无穷小),0/0返回NaN(not-a-number) /*这里的NaN甚至和自己都不相等,所以isNaN()里面是通过x!=x来判断的*/

 二进制浮点数和四舍五入错误

  实数有无数个,但是js通过浮点数的形式只能表示其中有限个数(18437736874454810627个),所以很多时候仅仅是一个近似值。

  采用了IEEE-754浮点数表示法(一种二进制表示法,可以精确地表示1/2,1/8,1/1024等),这导致类似0.1这样的简单数字都不能精确表示……(如.3-.2与.2-.1不相等)

  /*真实运行环境:0.3-0.2=0.09999999999999998*/

文本:通过字符串类型来表示,而字符串由一组16位值组成的不可变的有序序列。

  字符串:长度是16位值的个数。/*没有所谓的字符型*/

  字符串所有的操作方法都是作用于16位值,而非字符,且不会对代理项对做单独处理,也不会做标准化加工,甚至不能保证字符串是合法的UTF-16格式。

  字符串直接量:单引号与双引号之间可以相互包含。

ECMAScript3中,字符串直接量必须写在一行。

ECMAScript5中,字符串直接量拆开写每行需用反斜线“\”结束。

转移字符:以"\"加上一个字符就会发生化学反应……

  \n:换行符

  \o:NUL字符

  \b:退格符

  \t:水平制表符

  \v:垂直制表符

  \f:换页符

  \r:回车符

  \':单引号;\":双引号;\\:反斜线;

  有两个特殊的转义字符是通用的:

    \xXX:通过16进制数表示Latin-1或Unicode中的任意字码。/*例如\xA9表示版权符号*/

    \uXXXX:由4个十六进制数指定任意的Unicode字符。/*例如\u03c0表示字符π*/

J s的内置功能

  1.字符串之间用"+"可以连接

字符串的方法

  str.charAt(index):获取str对应下标为index的字符

  str.substring(start,length):获取str从下标start开始,长度为length的子字符串。/*与slice方法相同*/

  str.slice(-3):获取最后三个字符。/*只有一个参数的情况*/

  str.indexOf("l"):字符"l"首次出现的位置,对应的有str.lastIndexOf("l"),以及s.indexOf("l",3);从位置3开始(包括位置3),首次出现字符"l"的位置。

  str.split(","):分割成若干子串,即字符串数组。

  str.replace("h","H"):将str中所有的"h"替换成"H"。

  str.toUpperCase():全部大写,对应的有toLowerCase();

  记住,在Js中字符串是固定不变的,类似replace()以及toUpperCase()的方法都是返回新字符串,原字符串本身并没有发生变化

  /*在ECMAScript5成型之间,绝大部分的浏览器已经支持str[index]的访问形式。*/

模式匹配

Js定义了RegExp()构造函数,用来创建表示文本匹配模式的对象。这种模式称为"正则表达式",采用的是Perl中的正则表达式语法。

String和RegExp对象均定义了利用正则表达式进行模式匹配和查找与替换的函数。

RegExp:是一种强大和常用的文本处理工具。

  1.并不是JavaScript的基本类型,和Date一样,只是一种具有实用API的特殊对象。/*API很丰富*/

  2.但是依然具有直接量写法。/*两条斜线之间的文本构成一个正则表达式直接量*/

RegExp的语法规则

  /^HTML/  匹配以HTML开始的字符串

  /[1-9][0-9]*/  匹配一个非零数字,后面是任意个数字

  /\bjavascript\b/i  匹配单词"javascript",忽略大小写

RegExp的方法

  pattern.test(str);返回布尔值,是否匹配成功

  str.search(pattern);返回首次匹配成功的位置。如果匹配不到,返回-1

  str.match(pattern);所有匹配组成的数组

  str.replace(pattern,"#");将匹配到的都替换成"#"

  str.split(/\D+/);用非数字字符截取字符串。/*例如:"a1,2,3"=>["","1","2","3"]*/

布尔值:任何JavaScript的值都可以转换为布尔值。当js期望使用一个布尔值的时候,假值会被当成false,真值会被当成true

  false(假值):undefined,null,0,-0,NaN,"" //空字符串

  true(真值):其他所有值,包括所有对象(数组)

  所以直接用if(o)来判断对象o是不是假值。/*这里有一个操作符可以学习:!==,不等操作符,*/

  API:toString(),转换成对应的字符串,"true","false"

布尔运算符

  &&:与(AND)操作

  ||:或(OR)操作

  !:非(NOT)操作,一元操作符

null:特殊值,用来描述"空值",执行typeof运算返回字符串"object",可见是一个特殊的对象值,含义是"非对象"。

  通常认为null是它自有类型的唯一一个成员,表示数字、字符串和对象是"无值"的。

undefined:更深层次地明确是"未定义"。也表示"值得空缺"。与null在"=="是相等的,但是在"==="是不等的。

/*null和undefined没有任何属性和方法,所以使用"."或者"[]"会报类型错误:TypeError*/

 

/*undefined,系统级的,出乎意料的或类似错误的值的空缺;null,程序级的,正常的或意料之中的值的空缺--->赋值给变量或者属性,用于参数传入函数*/

全局对象:在JavaScript解释器启动时会创建一个新的全局对象,并给它一组定义的初始属性:

  .全局属性,比如undefined,Infinity和NaN

  .全局函数,比如isNaN()、parseInt()和eval()

  .构造函数,比如Date()、RegExp()、String()、Object()和Array()

  .全局对象,比如Math和JSON

  /*这些初始属性并不是保留字,但是应该作为保留字来对待。*/

  在代码的最顶级,使用this关键字可以引用全局对象:var global=this;

  在客户端JavaScript中,Window对象充当了全局对象,其中的window就相当于前文讲到的this来引用全局对象,

    除此之外,它针对Web浏览器和客户端JavaScript定义了一少部分其他全局属性。

PS:如果代码声明了一个全局变量,那么这个全局变量就是全局对象的一个属性。

包装对象

  js对象是一种复合值(它是属性或已命名值的集合)

  通过"."符号来引用属性值,如果该属性值是一个函数时,称其为方法,调用时需加上"()"。

  1.var s="hello world";这里的s是字符串直接量,本身不是对象,没有任何的属性和方法。

  2.但是当引用s.substring(0,2)等字符串的属性的时候,就会通过调用new String(s)的方法转换成对象。

  3.当属性引用完毕后,便会销毁这个对象。---这里的临时对象就是被称作包装对象

  同理数字和布尔值也是如此,一个是通过Number(),一个是Boolean()

类型转换

  1.布尔值是任何类型值都可以自行转换的。

  2.一般js都会自动识别根据期望变成对应类型。如果转成数字有异常的话,会转变成NaN

    

转换和相等性

  "==":判断两个值是否相等,在判断时,会自动进行类型转换。/*"=="不会将其操作数转换为布尔值,如果是布尔值会对应转成数字等等……*/

  PS:如果字符串与布尔值进行比较,则都会先会转换成数字,然后再进行比较。

  "===":不会进行类型转换的判断。

显式类型转换

  基础的方法:Boolean(),Number(),String(),Object()  /*Object(null)不会返回错误,而是返回一个空的对象*/

  任何值(除了null和undefined)都有toString()方法。

  +:作为一元运算符,会把其操作数自动转换为数字;作为二元运算符,如果有字符串则进行字符串的加法运算。

  !:会将其操作数转换为布尔值。

Number类:转换数字仅仅是基于十进制数进行转换。

  toString(radix):可选参数radix,表示转换基数,Number类特有。

  toFixed(x):指定小数精确位的字符串转换。

  toExponential(x):指定小数精确位的指数形式的字符串转换。

  toPrecision(x):指定有效数字,如果x小于整数位,则会使用指数形式表示。

  parseInt(),parseFloat():全局函数,可以转换第一个非空格字符是数字直接量的字符串。并且可自动识别八进制,十六进制格式。

  /*其中parseInt()还支持两个参数,后一个参数指定数字转换的基数,范围:2~36*/

对象转换为原始值:所有对象转换成布尔值都是true

  继承两个转换方法:

  1.toString():返回字符串

    默认:[object object]

    数组类:以逗号分隔元素的字符串

    函数类:源代码字符串

    日期类:返回一个可读的日期和时间字符串(可以用于new运算)

    RegExp类:返回正则表达式直接量的字符串

  2.valueOf():如果存在任意原始值,它就默认将对象转换为表示它的原始值。

    PS:因为大多数情况下对象都是复合值,无法用原始值表示,所以会返回对象本身。

    日期类:返回一个内部表示(从1970.1.1以来的毫秒数)

对象到字符串转换经历

  one.如果对象具有toString()方法->调用toString()->最终返回

      one.1 如果返回一个原始值(非字符串)->将这个值转换为字符串

      one.2 如果是字符串,不进行操作

  two.如果对象没有toString()方法,或者返回的不是原始值->调用valueOf()

      two.1 如果返回值是原始值,则将其转换为字符串

      two.2 如果无法获得原始值,则抛出一个类型错误异常。

对象到数字转换经历:与字符串转换不同的是优先使用valueOf()方法。

  PS:在使用"+"或者"=="运算符与对象转换到数字经历类似,优先使用valueOf(),不行再使用toString().

  例子:a=[1];console.log(a+2);结果是12.

  日期类是js语言核心中唯一的预先定义类型,它定义了有意义的向字符串和数字类型转换。……

变量的声明:不多说……

  1.重复的声明是合法且无害的……

  2.一定要声明哦,骚年~

变量的作用域

  1.局部变量的优先级高于全局变量

  2.对局部变量操作不会影响同名的全局变量。(即嵌套作用域的情况)

  3.作用域的界限在函数内,不以{}为范围……(非正式地称为声明提前)

  例:

    var s=12;

    function f() {

      console.log(s);

      var s=16;

    }

    f();

  这里输出的结果是undefined.

  PS:这使得js程序猿的一个优秀习惯是把声明都集体放到函数顶部。

作为属性的变量

  如果是var声明的全局变量,无法用delete删除;但如果是未声明的变量直接赋值而创建的全局变量是可以删除的。

  PS:ECMAScript规范中强制规定全局变量是全局对象的属性。

  对于局部变量没有如此规定……但是对应局部函数也会生成一个对象:(局部变量就是这对象的属性)

    ECMAScript3规范称之为"调用对象";

    ECMAScript5规范称之为"声明上下文对象";

作用域链

  js是基于词法作用域(此概念可查阅:http://www.cnblogs.com/Quains/archive/2011/04/12/2013121.html)的语言

  核心语句:当定义了一个函数后,当前的作用域就会被保存下来,并且成为函数内部状态的一部分。结合调用对象会好理解一点。

  js查找变量x的值---变量解析:(函数之间是可以嵌套的)

    调用对象---调用对象---...---全局对象(一条链子:作用域链)

    在调用对象里找,如果没有,就查找链上下一个对象,如果最终没有找到,会抛出一个引用错误(ReferenceError)异常。

1.定义函数时,函数本身会保存一个作用域链(链表,相当于链表上的节点内容是空的);

2.调用函数时,会创建一个新的对象(调用对象,存储局部变量,并将该对象添加至此前保存的作用域链上)

3.同时会创建一个新的更长的表示函数调用作用域的"链"。

4.最终的作用域链是由多个作用域链合起来的……但是原来分属于每个函数的作用域链依旧存在着。

PS:这块概念对于理解with语句以及闭包概念至关重要。值得仔细推敲!!!

 

 

 

 

  

posted @ 2015-11-04 19:13  小路orz  阅读(150)  评论(0)    收藏  举报