JAVASCRIPT

来源:互联网 发布:php简单论坛源码 编辑:程序博客网 时间:2024/06/07 11:19
JAVASCRIPT————一个面向对象的跨平台脚本语言。

什么是面相对象? 


从最基本的层面上来说,对象是一系列属性的集合,对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
面向对象是一种对现实世界理解和抽象的方法

什么是跨平台? 


什么是脚本? 


HTML文件必须在浏览器里执行
JS文件必须嵌入到HTML文件里才能执行
凡是不能独立执行需要依赖其他程序的,通常都叫做脚本。

JS的特点:
1、松散性    (弱类型语言)
2、面相对象   (但没有类的概念)
3、继承
4、没有多态

JS的发展历史:
1995, Netscape    LiveScript 
目的: 表单验证 ------为了减轻服务器的负担

1996,微软, JScript

1997,  ECMA(欧洲计算机制造商协会)----->TC39

第一个标准: ECMA-262
主流浏览器  Firefox\Chrome\Safari\Opera
javascript和java的关系,没有关系,但JS的结构设计上借鉴了很多JAVA的内容

标准的重要性:

ECMA组成:


第一个程序的编写:
document.write("\"你的报酬不是和你的劳动成正比,而是和你的劳动的不可替代性成正比。\"————尹涛");

//常见的转义字符
document.write("\t");  //tab键
document.write("\n");  //换行
document.write("\\");  //表示输出一个  \
document.write("\"");  //表示输出一个  "

 javascript中的注释

js中的{}与;
js的解释器在解释不以结束的一行语句,解释器会先去判断后边的代码是否能与当前行的代码放一起执行,如果能执行就把两行代码合并,如果不能合并就会加上,若还不能执行,就报错。这时就会出现一种情况,如果第二行的代码是以{开头的,js解释器可能就会将上下行的代码解释为一个 函数 ,因此很多的js代码开头都会以开头,为的就是避免这种情况(比如:js多个文件压缩时,代码合并)的发生。
例外1:当js在解释时遇到 break,return,continue,都不会与下行代码合并执行,因此在返回值时:如return a;时,一定要将语句与return放在一行,否则return将直接退出程序(不会返回a)
例外2:当遇到--  ,  ++时仅会与下一行的语句合并执行
a=1b=2a++b//那么结果a与b分别是多少//a=1//b=3
建议: ; 与 }  该写就写,不要省略

引入方式:
1  嵌入页面
<script type="text/javascript">
    //.............
</script>

2 外部文件 (在引用了外部文件的情况下,在标签里写js代码是无效的)
    <script src="004.js">
        document.write("这句代码无法执行!");
    </script>


变量:  
var a  = 100;


数据类型:(对象类型!)
第一种看法:

number ---->  整数、浮点数
string  字符串
boolean 布尔类型(boole,开创了逻辑学与数学的结合)
undefined   对于JS来讲,一个变量如果没有赋值,不能确定类型,类型就是undefined
object  对象类型 (null的类型也是object)
function 函数类型

第二种看法:
基础数据类型(原始数据类型、不可改变数据类型):
number  string  boolean undefined  null
复杂数据类型://由属性及属性值构成的无序列表的合集
object 对象类型

基础数据类型进行比较是对其值进行比较
复杂类型(对象)比较是对引用进行比较

基础数据类型与复杂数据类型的区别:
1、复杂数据类型(对象)有属性和方法(方法本质是一个特殊的属性)
2、复杂数据类型(对象)是可以改变的,基础数据类型是不能改变的,如下图:
a.length时a被转为对象类型,执行后被浏览器回收,不生效

原始值
存储在栈(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

  


对象的分类:
内部对象:错误对象;常用对象(8个:);内置对象:grobal ,Math,JSON,特点:使用时不用new操作符
数组对象:
自定义对象:


undefined和null的区别
相同点:都表示无,都没有方法,Boolean(undefined | null) = false
不同点:
1、null是一个关键字,而undefined不是(因此可以作为变量名)
2、typeof undefined//undefined
      typeof null //object
3、null 本质是一个空的对象,而undefined本质是window的一个属性,它是window已经定义了的属性,只不过它的值为未定义,当一个变量被定义为undefined看似没有意义,但对于某些场景对性能
4、Number(null)             //0
      Number(undefined)  //NaN
建议:
1、在声明一个变量一定要赋值时(或定义一个对象的某个属性值时),使用 null
2、检测某个值是否存在建议使用 ===undefined,判断某个值是否为空时使用==null(包含着隐性转换)
如:判断参数是否传入、某个属性(方法)是否存在 使用 ===undefined

Boolean:
在js的数据类型进行Boolean类型转换时、能被转换为 false 的有六种:
0-0NaNundefinednull""(空字符串)
  注意:object(空对象,如:空数组) Boolean转换为true
Number(true) //1   Number(false)//0

Number:
js中的0.1+0.2 != 0.3 这是因为计算机在计算时是转为二进制计算,0.1转为二进制无法在小数点后52位表示
完整,因此产生误差。
NaN 是一个特殊数字,当变量无法进行计算得出结果的时候,那么久会出现NaN   全称:  Not a Number
typeof NaN  //number     NaN==NaN   //false
NaN是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 =0
undefined - null// NaN - 0 =NaN
undefined + true // NaN + 1=NaN

逻辑运算符:
&& 且,
 || 或,
  ! 非,
关系运算符:   //更偏向数字
 > <  
>=  <=  
==  !=  
===  !===
关系运算符某一边出现数字,则都将转为number运算;若两端为string,则是对字符串的编码进行的比较
赋值运算:
=+=  -= *= /+
运算符: 数学运算、赋值运算、逻辑运算、关系运算

浮点数的运算  ------ 0.1+0.2 为什么不等于0.3???
这是由于计算机在运算的时候都是将变量转化为二进制,而小数转化为二进制时并不能很好的表示,会有一个循环,因而结果
解决方案:   首先将浮点数转为整数,进行运算,再除以相应的位数再转回十进制时会产生误差。

强制类型转换:
1  Number()函数     只针对 纯数字内容的字符串转换有效,且其相对于parseInt、parseFloat转化的范围更大(包括int  float...)
2  parseInt()函数     可用于取整操作;转化字符串时,转化第一个非数字字符前的数字,如parseInt(“123abc123”)=123
3  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);



原创粉丝点击