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//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);

 

 

posted @ 2017-10-27 08:46  fanlinqiang  阅读(138)  评论(0编辑  收藏  举报