javascript
javascript————一个面向对象的跨平台脚本语言。
HTML文件必须在浏览器里执行,JS文件必须嵌入到HTML文件里才能执行凡是不能独立执行需要依赖其他程序的,通常都叫做脚本。
javascript中的注释
// 单行注释 / * 一段注释 */ // 另一段注释 /* * 多行注释 * */
js中的{}与;
js的解释器在解释不以;结束的一行语句,解释器会先去判断后边的代码是否能与当前行的代码放一起执行,如果能执行就把两行代码合并,如果不能合并就会加上;,若还不能执行,就报错。这时就会出现一种情况,如果第二行的代码是以{开头的,js解释器可能就会将上下行的代码解释为一个 函数 ,因此很多的js代码开头都会以;开头,为的就是避免这种情况(比如:js多个文件压缩时,代码合并)的发生。
例外1:当js在解释时遇到 break,return,continue,都不会与下行代码合并执行,因此在返回值时:如return a;时,一定要将语句与return放在一行,否则return将直接退出程序(不会返回a)
例外2:当遇到-- , ++时仅会与下一行的语句合并执行
a=1 b=2 a ++ b //那么结果a与b分别是多少? //a=1 //b=3
引入方式:
1 嵌入页面
<script type="text/javascript"> //............. </script>
2 外部文件 (在引用了外部文件的情况下,在标签里写js代码是无效的)
<script src="test.js"></script> <script src="test.js"> document.write("这句代码无法执行!"); </script>
数据类型
JS 中分为七种内置类型,七种内置类型又分为两大类型: 基本类型和对象(Object)。
基本类型有六种: null,undefined,boolean,number,string,symbol。
number 的数字类型是浮点类型的,没有整型。并且浮点类型基于 IEEE 754标准实现,在使用中会遇到某些 Bug。NaN 也属于 number 类型,并且 NaN 不等于自身。
string 字符串
boolean 布尔类型(boole,开创了逻辑学与数学的结合)
undefined 对于JS来讲,一个变量如果没有赋值,不能确定类型,类型就是undefined
null
symbol
基础数据类型与复杂数据类型的区别:
基础数据类型进行比较是对其值进行比较
复杂数据类型(对象)比较是对引用进行比较
复杂数据类型(对象)有属性和方法(方法本质是一个特殊的属性)
复杂数据类型(对象)是可以改变的,基础数据类型是不能改变的,如下:
> let str = 'test' > str.length = 1 > str 'test' > str.length 4
a.length时a被转为对象类型,执行后被浏览器回收,不生效
对于基本类型来说,如果使用字面量的方式,那么这个变量只是个字面量,只有在必要的时候才会转换为对应的类型
let str = 111 // 这只是字面量,不是 number 类型 str.toString() // 使用时候才会转换为对象类型
对象(Object)是引用类型
> let person = { name: 'fanlinqiang' } > let man = person > man.name = 'test' > console.log(person.name) test
原始值
存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。(js中的valueOf())
引用值
存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处
数据类型的转换:
对象转字符串类型:先调 toString()方法,然后再调valueOf()方法对象转数字类型:先调valueOf()方法,然后再调toString()方法对象转原始值:大多数情况下,先调 valueOf()方法,然后再调toString()方法;Date对象直接调用toString方法;
举例如下:
两个空数组相加即为对象转原始值的情况: [] + [] //结果为空串"",在这个过程中先调用valueOf()方法,返回的数组的原始值还是一个数组,再调用toString()方法,即为:"" + "" =""
[1,2] + 1 即为对象转数字的情况:[1,2] 先调用valueOf(),返回的还是数字本身,在调用toString(),返回字符串"1,2",则 "1,2" + 1 ="1,21"同理,1 + {a:1} // "1[object Object]"但是{a:1} +1 // 1, 这是因为js在解释代码时遇到{}会认为是一个代码块(代码区域),{a:1}已经结束的代码块,因此相当于原式= +1 // 1
(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]]
// sb
对象的分类:
内部对象:错误对象;常用对象(8个:);内置对象:grobal ,Math,JSON,特点:使用时不用new操作符数组对象:自定义对象:
undefined和null的区别
相同点:都表示无,都没有方法,Boolean(undefined | null) = false不同点:1、null是一个关键字,而undefined不是(因此可以作为变量名)2、typeof undefined//undefinedtypeof null //object3、null 本质是一个空的对象,而undefined本质是window的一个属性,它是window已经定义了的属性,只不过它的值为未定义,当一个变量被定义为undefined看似没有意义,但对于某些场景对性能4、Number(null) //0Number(undefined) //NaN
建议:
1、在声明一个变量一定要赋值时(或定义一个对象的某个属性值时),使用 null2、检测某个值是否存在建议使用 ===undefined,判断某个值是否为空时使用==null(包含着隐性转换)如:判断参数是否传入、某个属性(方法)是否存在 使用 ===undefined
Boolean:
在js的数据类型进行Boolean类型转换时、能被转换为 false 的有六种:0-0NaNundefinednull""(空字符串)注意:object(空对象,如:空数组) Boolean转换为trueNumber(true) //1 Number(false)//0
Number:
js中的0.1+0.2 != 0.3 这是因为计算机在计算时是转为二进制计算,0.1转为二进制无法在小数点后52位表示完整,因此产生误差。NaN 是一个特殊数字,当变量无法进行计算得出结果的时候,那么久会出现NaN 全称: Not a Numbertypeof NaN //number NaN==NaN //falseNaN是js中唯一一个不等于其本身的数据类型,因此也可以利用这点来判断某数据是否为NaN
NaN 不等于 NaN ,即 (NaN==NaN)=false判断一个变量是否是数字时可以用函数 isNaN(a)若a不是一个数字返回true若是返回false
String:
一般来说,js中只有对象可以使用属性和方法,在js的解析器中遇到.或[]时,会将前边的表达式尝试
转化为对象类型,这也是为什么基础数据类型中string能够访问length的原因,如:var a="abc"; a.length ;
但如果转化为对象失败则会报错,这也是为什么undefined 和null不能使用属性和方法的原因(高版本的某些
浏览器会将undefined、null转为空对象)
Number("") //0
变量的定义:
使用一个没有被var定义过的变量,会报错!var a ; //在编译这条语句时,js并没有严格的去规定a的类型,typeof a //只有当a被使用时才真的去识别a的类型
使用var定义的是局部变量;不使用var定义的是全局变量
var message = "hi"
,found = false
,age = 29; //建议将逗号写前边,避免遗忘
使用var变量与不使用var的区别?
1、使用var定义的是局部变量,不使用var定义的是全局变量。本质:使用var定义的是一个变量,其作用域是当前函数。不使用var定义的,严格的来说是给window定义了一个“全局的”属性(js作用域链无法找到这个变量,追溯到window(根)对象),而不是变量,window是全局对象,自然其属性也是全局的;2、使用var定义的变量不可以用delete删除,不使用var定义的可以被delete删除。本质:定义的变量是不能被删除的。对象是可以改变的,对象上边的属性是可以删除的,不使用var定义的变量等于是window的一个属性,自然就可以被删除。3、使用var定义的变量会声明提升,不使用var定义的不会被提升;对象是属性及属性值的无序列表的合集,因此不使用var定义的变量(window属性),其声明提不提升也就没有意义了。typeof ------>查看一个变量的类型
命名规则:
1 只能包含 数字、字母、下划线、$2 不可以 用数字开头(一般以字母打头,这里的字母不仅局限于26个英文字母,还包括各国的语言,比如:var 变量=1;但不推荐)3 JavaScript中的变量命名是区分大小写的
JavaScript中的操作符:(API:http://www.w3school.com.cn/js/pro_js_operators_unary.asp)
一元操作符:
一元 + ,将后续的表达式转化为数字,小技巧:将一个类型转为number类型 +tmp (Number(tmp));;一元 - ,将后续表达式转为数字后取负数;++ 递增 -- 递减 ,分前置和后置,前置先递增(或递减)再执行当前表达式,后置先执行当前表达式再递增(或递减);typeof 其后括号可写可不写,其不是一个函数;void ;delete;一元 !,将后续表达式转为Boolean类型取反,小技巧:将一个类型转为Boolean类型 !!tmp (Boolean(tmp));
二元操作符:
*、/、- 将两边表达式转为数字,然后进行计算% 取余二元+,当遇到某一边是字符串时进行"拼接" ,如:数字转字符串 123 + "" String(123) 两侧是数字则加法,(更偏向字符串操作)当boolean、undefined、null进行混合运算时,都会转成数字进行计算false - null // 0 - 0 =0undefined - null// NaN - 0 =NaNundefined + true // NaN + 1=NaN
逻辑运算符:
&& 且,|| 或,! 非,
关系运算符: //更偏向数字
> <>= <=== !==== !===关系运算符某一边出现数字,则都将转为number运算;若两端为string,则是对字符串的编码进行的比较
赋值运算:
=+= -= *= /+
运算符: 数学运算、赋值运算、逻辑运算、关系运算
浮点数的运算 ------ 0.1+0.2 为什么不等于0.3???
这是由于计算机在运算的时候都是将变量转化为二进制,而小数转化为二进制时并不能很好的表示,会有一个循环,因而结果
解决方案: 首先将浮点数转为整数,进行运算,再除以相应的位数再转回十进制时会产生误差。
强制类型转换:
1 Number()函数 只针对 纯数字内容的字符串转换有效,且其相对于parseInt、parseFloat转化的范围更大(包括int float...)2 parseInt()函数 可用于取整操作;转化字符串时,转化第一个非数字字符前的数字,如parseInt(“123abc123”)=1233 parseFloat()函数 转化为浮点数;
位运算:
var a = 3&5; //对数字进行按位与运算
/**
0000 0011
0000 0101
0000 0001 与 1
0000 0111 或 7
0000 0110 异或 6
*/
var d = a<<2; //移位--- 左移两位
var d = a>>3; //0
进制问题:
十进制、八进制、十六进制
var a = 99;
var b = 072;
进制转换----> toString(进制数)
var a = 072; //八进制 58
var b = 0xAF; //十六进制 175
alert(a.toString(16)); //3a (不能为具体数字,只能是变量).toString()
var str = "3a";
parseInt(str, 16); //第二个参数,指定字符串的进制形式
程序的三大结构:顺序结构、选择结构、循环结构
if -- else
非布尔类型的条件判断
if( 2 ) number类型 ------>所有的非0数字代表 true , 0代表false
if("abc") string类型 -------> 所有的非空字符串都代表 true, "" 代表false
if(obj) object类型 -------->所有的非null的对象都代表true,null代表false
if(undefined) -------> 代表false,
if(NaN) --------> 代表false
if( function ) ---------> 如果函数存在,代表true
switch
var num = 3;
switch(num) {
default : alert("不知道!"); break; //这里也需要break
case 1 : alert("星期一"); break;
case 2 : alert("星期二"); break;
}
document.wirte() 会覆盖页面原有的内容,因此我们平时测试,都会将信息输出到控制台 console.log(xxxxxx);