JavaScript学习笔记(一)

  这几天看了哈JavaScript高级程序设计的前几章,并将其中的一些知识点做一个整理。
  JavaScript是采用的Unicode字符集编写的,像Java、C#等程序设计语言一样,JavaScript也是区分大小写的,但html是不区分大小写的,当客户端JavaScript对象和属性与他们所表示的html标签和属性同名时,JavaScript语法中,只能用小写来表示(例如在html中的onClick,只能写成onclick)。其不同于其他面向对象语言的是:1、JavaScript语句结束并不一定需要使用”;”,但在必要(解析时可能出现歧义或与与功能不符时)时,必须使用分号,表示语句结束 2、没有类和接口的概念,同时也就不需要注册类了。 3、对象的属性和方法不是固定的,可以随时动态添加属性和方法。 4、变量的作用域依赖于其执行环境,而非语句块
  JavaScript的类型分为两种:一种是原始类型、另一种是对象类型。只有原始类型中null、undefined没有方法,其余的类型都有方法可以直接使用。
  JavaScript的变量是无类型(untyped)的,变量可以赋予任何类型的值,同一个变量也可以赋予不同类型的值。使用var来声明变量,JavaScript采用词法作用域(lexical scoping)。不在任何函数内声明的变量称为全局变量(global variable),在函数内声明的变量具有函数作用域(Function scope),JavaScript没有其他面向对象语言中块作用域的概念,但可以通过匿名立即执行函数实现块作用域function(){//块作用域}();如果不在函数内,要使用(function(){//块作用域})();不然解释器会将其当做函数申明,重而产生语法错误。

1、原始类型 primitive type

  原始类型有5种,除了null和undefined没有方法之外,其余3中都有方法可以使用,其方法即为相应类型的包装类型的方法。原始类型数据通过
  数字:如果计算结果超出JavaScript数值范围,那么其值会定义为正或负Infinity(无穷大,Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY中保存的也是正、负无穷大),NaN(not a number)表示本来要返回数值的情况未返回数值(比如2/0)。数值转换:true(1) false(0) null(0) undefined(NaN) “”(0) 如果字符串中包含除数字之外的字符(16进制数a-f除外),则为NaN。
  字符串:不可变对象
  布尔值:任何类型都可以调用Boolean()将其转换为布尔值,返回true为string的非空字符串、任何非零数字(NaN会返回false)、非null对象,undefined会返回false。
  null:由于undefined是派生自null值的,因此,null==undefined总是返回true。保存对象的变量如果还没有真正保存对象,就应该显示的将变量赋值为null
  undefined:申明的变量在没有赋值的情况下,其值都是undefined ,未定义的变量和定义了但没有赋值的对象使用typeof运算后的结果都是undefined,如果要区分变量是否定义,显示的初始化变量是一种有效方法

2、对象类型 object type

  JavaScript中没有类的概念,其对象由属性集合构成。每个属性都是由“名/值对”(值可以是原始值,也可以是对象)构成的。对象的创建有两种方法:1. 使用new关键字+构造函数创建对象,例如var obj = new Object(); obj.name = “ysj”; 2.使用对象字面量创建对象, var person = {name : “ysj”, age : 25, 5 : true}其中属性5会自动转换为字符串。同时, var person = {}等价于var person = new Object();对象字面量也是函数参数传递的一种常用方法。对象属性的访问可以通过点表示法,同时还可以使用方括号访问属性,使用方括号的优势在于:1.可以通过变量来访问属性 2.可以访问属性名为不符合命名规范的属性。
  每个对象都有以下属性和方法:
  constructor:保存着用于创建当前对象的构造函数的引用,对象字面量创建的对象的构造函数为Object,如果以赋值的方式修改了原型,那么其constructor将变为Object。
  hasOwnProperty(propertyName):用于检查给定的属性是否存在于当前对象实例(而不是实例的原型中)。
  isPrototypeOf(object):用于检测传入的对象是否是该对象的原型。
  propertyIsEnumerable(propertyName):用于检测给定属性是否能用for-in语句进行枚举。
  toLoacalString():返回对象的字符串表示,该字符串与执行环境有关。
  toString():返回对象的字符串表示。
  valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()返回值相同。

2.1 数组 Array

  普通的JavaScript对象是“命名值”的无序集合。但JavaScript还定义了一种特殊的对象——数组,带有编号的有序集合。数组的创建方式有:1.var arr = new Array()不知道数组长度 2.var arr = new Array(number)创建长度为number的数组 3.var arr = new Array(args)创建含有args元素的数组,长度为args.length。4.var arr = []等价于var arr = new Array()。var arr = [value,value,value,value],数组长度为4。数组的长度不仅是只读的,还可以自己设置其长度,设置其长度后,如果长度比当前长度小,则将最后几个数据值置为undefined,如果比原来的大,同样把没有赋值的项都置为undefined。数组的最长长度为4 294 967 295,超出这个长度就会出现异常。
数组可以作为stack,queue,deque来使用,push、pop方法组合作为stack使用,push、shift组合作为队列使用,unshift、pop组合作为反向队列使用。
迭代方法:对数组中每一项都运行指定函数,但其返回结果又很大区别
every():如果每一项都返回true,则返回true。
filter():返回函数返回true项组成的数组。
forEach():没有返回值(即不关心返回值)。
map():返回每次函数调用的结果组成的数组。
some():有任何一项返回true,则返回true。
归并方法:
reduce()、reduceRight():迭代数组中的每一项,并将最后的结果返回。这两个函数的参数为:在每一项上调用的函数、作为归并基础的初始值(不是必须的)。在每一项上调用的函数有四个参数:pre前一个的结果值、cur当前值、index当前的索引、arr数组对象。

2.2 函数 Function

  JavaScript还定义了一种特殊的对象——函数,他们都是真值,并且JavaScript还可以将他们当做普通对象来使用。
  函数的名字仅仅是一个指向特定函数的指针而已。函数也有属性和方法。
  每个函数都会包含两个属性:1.length 表示函数希望得到的命名参数的个数 2.prototype,在es5中,prototype是不可枚举的,因此,使用for-in无法发现,js的继承就是通过prototype来实现的,prototype是一个很强大的属性。
  每个函数都包含两个非继承而来的方法:apply()和call(),这两个方法的作用都是在特定的作用域中调用该函数,第一个参数都是函数的运行环境(可以是this,表示当前执行环境),apply的第二个参数为arguments或者是数组,而call的后面参数个数不确定,是将所有参数罗列出来,不像apply直接以数组方式传递进去(在严格模式下,未指定函数对象而调用函数,则this值不会转型为当前运行环境。除非明确把函数添加到某个对象或者调用apply或call方法,否则this值将是undefined)。es5还定义了bind()方法。
  函数内部属性arguments和this,es5中还定义了属性caller(指向调用该函数的函数,如果在全局作用域中调用函数,则该引用为null)。arguments内保存了调用该函数时的所有参数,同时,其自身还有一个callee属性(为一个函数的引用,指向函数自身)。在严格模式下,出于安全考虑,caller和callee访问都会报错。this引用的是函数据以执行的环境对象。
  函数的命名参数不是必须的。申明function时的参数个数可以和调用该方法时传递的参数类型或个数不相同,如果有参数,则参数将放在arguments对象中,可以通过length属性获得参数个数,参数个数是由实际传入方法中参数个数决定,并不是由定义函数时的命名参数个数决定。通过下标访问每个参数。同时,arguments对象还可以和命名参数一起使用。对于没有传递值的命名参数将自动被赋予undefined,并且其值不能修改。这样解决了其没有重载的缺陷。
函数的声明和函数表达式是有区别的,在执行js之前,函数声明会被解析器的函数声明提升(function declaration hoisting)添加到执行环境中,而函数表达式不会。
函数也可以作为参数传递给另一个函数。

2.3 正则 RegExp

  使用正则表达式字面量时,一定要像直接使用RegExp构造函数一样,每次都必须创建新的实例。
RegExp的3个标志:
 1.g 表示全局模式,即模式被应用于整个字符串,而非找到第一个匹配项后立即停止。
 2.i 表示不区分大小写(case-insensitive)模式,即在确定匹配项时,忽略模式与字符串的大小写
 3.m 表示多行模式(multiline),即达到一行文本末尾时,还会继续向下一行查找。
RegExp的属性有:
 1.global 布尔值,表示是否设置了g标志
 2.lastIndex 整数,表示开始搜索下一个匹配项的字符位置,从0算起。
 3.ignoreCase 布尔值,表示是否设置了i标志
 4.multiline 是否设置了m标志
 5.source 正则表达式的字面量表示的字符串形式

3. 操作符

  2.1 typeof是检测给定变量的数据类型,其结果可能为
  1).”undefined”表示这个 值 未定义
  2).”boolean” 表示这个值为布尔值
  3).”string” 表示这个值为字符串
  4).”number” 表示这个值为数字
  5).”object”表示这个值是对象或null
  6).”function” 表示这个值是函数
  2.2 instanceof
  typeof是用来判断值的类型,而instanceof则是用来判断对象是否是某个构造函数的实例。

4.语句差异

  和其他面向对象的语言不容的是,JavaScript中的switch()语句中可以放任何类型的数据,包含对象类型,其次,每个case的值不一定是常量,可以是变量、常量、表达式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值