javascript使用Unicode字符集编写的。javaScript是区分大小写的语言。
标示符就是一个名字。在javascript中用标示符来对变量和函数进行命名或者用做javascript代码中某些循环语句中的跳位置的标记。javascript标示符必须以字母、下划线、美元福$开始,后续的字符可以是字母,数字,下划线,美元符号(数字不允许首字母出现,以便区分开标示符和数字)。
保留字
编程语言最基本的特性:支持多种数据类型,变量(variable)的工作机制是编程语言的另一个特性。
javascript数据类型:原始类型和对象类型。
原始类型(primitive type)包括数字,字符串和布尔值;特殊的原始类型:null(空)和undefined(未定义)。
对象是属性的集合。普通的对象是“命名值”的无序集合;特殊对象——数组,表示带编号的值的有序集合;特殊对象——函数,函数是具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回运算结果;如果函数用来初始化(使用new运算符)一个新建的对象,称之为构造函数(constructor);日期类——日期的对象;正则类——正则表达式(一种强大的模式匹配工具)的对象。
javascript的类型:可以拥有方法的类型和不能拥有方法的类型;可变类型(mutable)和不可变类型(immutable)(可变类型的值是可以修改的。javascript可以更改对象属性值和数组元素的值;数字布尔值、null、undefined属于不可变类型,字符串也是不可变的。)
javascript解释器有自己的内存管理机制,可以自动对内存进行垃圾回收。
javascript是一种面向对象的语言。
javascript中只有null和undefined是无法拥有方法值的。
javascript变量是无类型的,变量可以被赋予任何类型的值,同样一个变量也可以重新赋予不同类型的值。
包装对象:存取字符串、数字或布尔值的属性时创建的临时对象。它只是偶尔用来区分字符串值和字符串对象、数字和数值对象以及布尔值和布尔对象。包装对象只是被看做是一种实现细节,而不用特别关注。由于字符串、数字、布尔值的属性是只读的并且不能给他们定义新属性,他们是有别与对象的。可以通过String()、Number()、Boolean()构造函数来显式创建包装对象。
javascript会在必要时将包装对象转换成原始值。
javascript采用词法作用域(lexical scoping):
全局变量(global variable):不在任何函数内声明的变量,它在javascript程序中的任何地方都是可见的。
在函数内声明的变量具有函数作用域(function scope),并且只在函数内可见。
数字:javascript不区分整数值和浮点数值。javascript中所有数字均用浮点数值表示。
数字直接量(numeric literal):一个数字直接出现在javascript程序中。
javascript程序是使用 本身提供的算数运算符来进行数字运算的。基本的算术运算:+、—、*、/、%(求余:整除后的余数);复杂运算符:通过为Math对象的属性定义的函数和常量来实现。
console.log(Math.pow(2,3))//8 2的3次幂 console.log(Math.round(.6))//1 四舍五入 console.log(Math.ceil(.6))//1 向上求整 console.log(Math.floor(.6))//0 向下求整 console.log(Math.abs(-5))//5 求绝对值 console.log(Math.max(1,2,7))//7 返回最大值 console.log(Math.min(8,3,9))//3 返回最小值 console.log(Math.random())//0.2526274783389907 生成一个大于等于0小于等于1.0的伪随机数 console.log(Math.PI)//3.141592653589793 console.log(Math.E)// 2.718281828459045 console.log(Math.sqrt(3))//1.7320508075688772 console.log(Math.pow(3,1/3))//1.4422495703074083 console.log(Math.sin(0))//0 console.log(Math.log(10))// 2.302585092994046 console.log(Math.log(100)/Math.LN10)//2 console.log(Math.log(512)/Math.LN2)//9 console.log(Math.exp(3))// 20.085536923187668
javascript中算数运算在溢出(overflow以Infinity表示)、下溢(underflow将返回0)或被零整除时不会报错(简单的返回无穷大或负无穷大;0/0是NaN;无穷大除以无穷大、给任意负数做开放运算或算数运算符与不是数字或无法转换为数字的操作数一起使用时都将返回NaN)。
console.log(Infinity)// Infinity console.log(Number.POSITIVE_INFINITY)// Infinity console.log(1/0)// Infinity console.log(Number.MAX_VALUE+1)// 1.7976931348623157e+308 console.log(Number.NEGATIVE_INFINITY)// -Infinity console.log(-Infinity)// -Infinity console.log(-1/0)// -Infinity console.log(-Number.MAX_VALUE-1)//-1.7976931348623157e+308 console.log(NaN)//NaN console.log(Number.NaN)//NaN console.log(0/0)//NaN console.log(Number.MIN_VALUE/2)//0 console.log(-Number.MIN_VALUE/2)//-0 console.log(-1/Infinity)//-0 console.log(-0)//-0
console.log(zero=0)//0 console.log(negz=-0)//-0 console.log(zero===negz)//true console.log(1/zero===1/negz)//false console.log(0.3-0.2==0.2-0.1)//false
javascript语言核心包括Date()构造函数,用来创建表示日期和时间的对象。
字符串直接量
javascript的内置功能之一就是字符串连接。
var s="hello,word" console.log(s.charAt(0))//h console.log(s.charAt(s.length-1))//d console.log(s.substring(1,4))//ell(位置和长度) console.log(s.slice(-3,-1))//or(两个位置。不包含结尾的元素。负值从右边第一个为-1。不改变原数组) console.log(s.indexOf("9"))//-1没有找到返回-1 console.log(s.indexOf("o"))//4区别于判断类型instanceof,typeof console.log(s.indexOf("o",2))//4从第三个位置开始o开始出现的位置 console.log(s.split(","))//["hello", "word"] console.log(s.split("",0))//[]从“”切分处的字符串或正则表达式返回0长度的数组
javascript定义了RegExp()构造函数,用来创建表示文本匹配模式的对象。这些模式称为“正则表达式”(regular expression).string和RegExp对象均定义了利用正则表达式进行模式匹配和查找与替换的函数。
布尔值指代真假、开关、是否。
任意javascript值都可以转换为布尔值。
undefined,null,0,-0,NaN,""(空字符串)会被转换成false。布尔运算符号:toString();与&&AND,或||OR,非!NOT;
null是javascript语言的关键字,他表示一个特殊值,常用来描述“空值”。null是一个特殊的对象值,含义是“非对象”。他可以表示数字,字符串和对象是”无值“的。
undefined是预定义的全局变量(它和null不一样不是关键字)它的值是未定义。
全局对象初始属性(不是保留字,但他们应该当做保留字来对待):全局属性(undefined、infinity、NaN),全局函数(isNaN()、parseInt()、eval()),构造函数(Date()、RegExp()、String()、Object()、Array()),全局对象(Math和JSON)
javascript对象是一种复合对象:它是属性或已命名值的集合。通过”.“符号来引用属性值。当属性值是一个函数的时候,称其为方法。通过o.m()来调用对象o中的方法。
字符串也同样具有属性和方法。
显式类型转换最简单的方法:Boolean()、Number()、String(),或者Object()函数。除了null或者undefined之外的任何值都具有toString()方法。这个方法的执行结果通常和String()方法返回结果一致。把null和undefined转换为对象,则抛出一个类型错误。(TypeError)。
(注意十六进制是0x是'数字零和字母x')
转换和相等性:(比较之前都转化成了数字)
console.log(null==undefined)//true
"0"==0//true0==false//true"0"==false//true所有对象继承了两个转换方法:
toString()作用是返回一个反映这个对象的字符串:
数组类(Array class)的toString()方法将每个数组元素转换为一个字符串,并在元素之间添加逗号后合并成结果字符串。
函数类(Function class)的toString()方法返回这个函数的实现定义的表示方式。(通常是将用户定义的函数转化为javascript源代码字符串)
日期类(Date class)定义的toString()方法返回了一个可读的(可被javascript解析的)日期和时间字符串。
RegExp类(RegExpclass)定义的toString()方法返回了将该对象转换为表示正则表达式直接量的字符串。
转换对象的函数valueof()它就默认将对象转换为表示它的原始值。
数组、函数、正则表达式调用这些类型的实例的valueof()方法只是简单的返回对象本身。
日期类定义的valueof()方法会返回他的一个内部表示。
日期类是javascript语言核心中唯一的预先定义类型,他定义了有意义的向字符串和数字类型的转换。
作用域:
scope="gloabal"; function checkscope2(){ scope="local"; myscope="local"; return [scope,myscope]; } checkscope2(); console.log(scope)//local console.log(myscope)//local
var obj = {a:1,b:2}; for(x in obj) { alert(x); alert(obj[x]); }//a,1,b,2
var scope="gloabal"; alert(1) function checkscope(){ alert(3) var scope="local scope"; function nested(){ alert(5) var scope="nested scope"; alert(6) return scope; alert(7) } alert(4) return nested(); alert(8) } alert(2) checkscope();//1,2,3,4,5,6
变量声明和变量作用域:
函数作用域和声明提前: