JavaScript语言基础

163 阅读10分钟

一、JavaScript的组成

核心:ECMAScript(为了可以让所有浏览器都使用js,我们定义了一个标准
ECMAScript,各大浏览器都必须按照这个标准来渲染页面)
文档对象模型:DOM
浏览器对象模型:BOM

二、JavaScript的引入及写法

对于html来说,从上向下同步解释性文档,上面的代码无法调用下面的标签或者script

内部书写

在html文件中直接进行代码的书写
    1、位于 head 部分的脚本:
    当你把脚本放置到 head 部分后,必须等到全部的javascript代码都被下载、解析和执行完成后,才能开始呈现页面的内容(浏览器在遇到body标签才开始呈现内容)。
    2、位于 body 部分的脚本:
    为了避免上述问题,现代web应用程序一般把javascript引用放在body中,放在页面内容后面。这样,在解析包含的javascript代码之前,页面内容将完整呈现。

外部引入

载入外部js,可以在head和body部分,一般将外部js在head部分引入<script src="路径名"></script>
路径名为当前文件夹./(都要加上)../上一级目录
如果加载的js中,变量或者函数相同时,就会覆盖,叫做变量污染

直接写在标签内

<p onclick="alert('你好');">点击我</p>
<!-- 不跳转 -->
<a href="javascript:void(0)">超链接</a>

三、注释

1、可以让不用的代码不执行
2、可以用来解释代码的作用,

单行注释

ctrl+/   行注释,注释一行的代码

块注释

shift+alt+a  块级/多行注释
1、可以用来注释一行中的部分内容
2、可以用来注释掉一个函数和大量代码块

## 四、调试 浏览器调试 ctrl+shift+i

五、常用方法

js语言每行结束时必须使用;结束,必须是半角
js代码中大小写必须严格按照规定
方法一般包括  方法名(参数...).都必须是英文半角
js是点语法,表示某个对象的方法和属性

控制台输出

var name = 'Petter';
// 1、输出字符串
console.log('Hello, world!');
// "Hello, world!"
// 2、输出变量
console.log(name);
// "Petter"
// 3、输出变量/字符串
console.log('Hello, ' + name + '!');
// "Hello, Petter!"

页面输出

document.write("Hello,word!");
write仅属于document的方法,可以给整个文档增加内容
document.body.innerHTML="hello,world" 
innerHTML是所有body内(含body)标签的属性,可以给这些标签内局部增加内容和标签
赋值,对象的属性需要赋值
对象有两种模式,一种是属性,属性的使用=赋值,一种是方法,方法需要()执行

提示框输出

alert("hello,word!");
alert(message?:any):void
提示  message 参数名称   ?可以不写值  :any 这个参数的类型可以是任意的,  :void  不返回任何值
将字符串以弹窗弹出,并且暂停到当前行
将window省略了,window.alert();

确认框

confirm("您确定要退出吗?");
弹出确定取消框

输入框

prompt("请输入您的名字");

六、变量

ES5之前
window.a = 3;
a = 3;
a=b=3;连等,先赋值给=号最左边的元素,再逐级向右。=号左侧是变量名称,=号右侧是值。不需要定义,随手写,不需要类型(弱类型)。=号赋值也是有返回值
a=b=3;     a=(b=3);  代码遵从从左至右的执行方式
ES5  不允许直接使用变量的赋值
var a = 3;定义变量,如果不使用var声明,那就这个变量就一定是window的属性。而在函数以外的地方使用var声明也是设置了window的属性

变量的命名:
1、一般首字母都是小写,除了类。都是用法驼峰式命名规则
2、临时变量必须使用_起头,后面接驼峰式命名,有时也会在函数的参数中使用临时变量命名 var _a=3;
3、变量不可以使用关键字和保留字
关键字 :break	do	instanceof	typeof  case	else		new	 var  catch	 finally	return	void  continue	  for	switch	while  function	 this	with 	default  if   throw		delete	in try
保留字:abstract int         short   boolean export           interface     static             byte extends long  super char
final  native   class	    float
throws    const  goto    private
double    import     public
4、全局变量名不能与window下的属性和方法同名

ES6
let 变量
const 
    常量 变量是定义后可以变化值的,常量是一旦定义值就不能改变值了,常量定义是名称必须全部大写,并且使用_区分单词,使用常量目的是不会被别人修改或者变量污染改变 const EVENT_ID="changes";

七、数据类型

数据的分类:(字符类型,数值类型,布尔类型,未定义型,空值,) 基本数据类型 (对象型) 复杂数据类型
1、字符型 string
    所有使用 ''  ""  ``都是字符型  
2、数值型 number
    小数叫做浮点数
    // var e=0xFF;//16进制
    // var f=065;//8进制
    // var g=3.1e+5;//科学计数法 3.1*10(5)5次幂
    // var h=3.5e-5;//科学计数法 3.5*10(-5) -5次幂
    定义的不一定和打印的结果完全相同,全部都会转换为10进制
3、布尔类型 boolean
    true,false    对和错,是和否,还可以认为是任何事情的两面
4、未定义值 undefinded
    var a;仅定义变量未设置值
    var b=undefined; 定义变量并且设置值为undefined;
    值是相同的但是形态不同
    var a;用于全局定义,然后根据需要时赋值,初始是没有值的
    var b=undefined  用于初始值必须是undefined,或者将原有有值的变量修改为undefined var x=10; x=undefined;
5、空值 null
    var a = null;
    console.log(typeof a);//object
    空值是将所有引用地址标记清空,用于清理内存 垃圾回收

    var obj={a:1};
    obj=null;
    // 字符类型,数值类型,布尔类型,未定义型都不需要null清除
6、对象类型
    获取对象中key的值时有两种方法
    一种是点语法,点语法使用范畴仅限于key属性固定,并且明确
    另一种是[]语法,如果是固定的key,就使用字符串方式来设定,
    如果不固定,直接[变量]就可以
    var d="names";
    obj={
        // key:value//关键词和值
        // 对象不能出现重复的key
        // key不需要加""
        a:1,
        b:"ab",
        "c":true,
        // 变量作为key必须在外层增加[]
        [d]:"xietian"
    }
    console.log(obj.a);
    console.log(obj.b);
    console.log(obj.names);
    console.log(obj[d]);
    console.log(obj["a"]);

八、数据类型转换

    数据类型的转换分为强制转换和隐式转换两种

数值类型转其他

1、数值转字符串
    var a = 3.1415;
    var b = String(a);//类型强制转换
    a=String(a);//将a转换为字符串覆盖原有的变量a
    a = a + "";//利用隐式转换方式,没有强制转换,根据运算特征自动转换为字符串,隐式转换
    隐式转换所使用的转换方法是自动执行String(a)

    toString()实际上是Object对象的方法,因此,万物皆对象,任何类型都可以调用这个方法
    a=a.toString(16);//参数必须是2-36之间否则报错;转换为指定的进制数
    toFixed(小数点位数) 转换为字符串,并且保留小数点位数,自动四舍五入
    toExponential(num)必需。规定指数计数法中的小数位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将使用尽可能多的数字。
    toPrecision(num)num为数字长度,把数字格式化为指定的长度
2、数值转换为布尔值
    除了0以外的所有值转换为布尔值都是true,0转换为布尔值是false
3、数值转换为对象
    var a = 0;
    a = Object(a);//数值型对象,储存在堆中

字符串类型转其他

1、字符串转换为数值
    var a = "3.2"
    a = Number(a);//强制转换为数值类型
    a = parseInt(a);//转换为整数
    a = parseFloat(a);//转换为浮点型
    var a = "101";
    a=parseInt(a,2);//将字符串转换为2进制,输出为十进制

    a = parseFloat();//不能转换进制

    var a = "a";
    a = Number(a);
    console.log(a);//NaN 数值类型中的非数值
    隐式转换遵从Number()转换方法
2、字符串转换为布尔值
    仅空字符串转换为布尔值时,是false,除此之外全部是true
3、字符串转换为对象
    var str="aaa";
    // str=Object(str);
    // 转换为字符串对象
    // console.log(str);

    // var str=" a a  ";
    // str=str.trim();//清除字符串前后空格

布尔值转其他

1、布尔值转换为数值
    true转换为1,false转换为0
2、布尔转换为字符
    转换后就是字符串true和false
3、布尔转换为对象
    转换后就是布尔值对象  

任何类型转换为布尔值

//var a="";
//var b=0;
//var c=NaN;
//var d=false;
//var e=null;
//var f=undefined;
//以上6种转换布尔值是false,其他都是true

undefined null转换为字符串和数值

//var a;
//var b=null;
//a=String(a);undefined
//b=String(b);null
//console.log(b);

//a=Number(a);//转换为数值是NaN
//b=Number(b);//转换为数值是0
    
//a=parseInt(a);//NaN
//b=parseInt(b);//NaN
//console.log(a,b);

尽量不要使用连等赋值

九、运算符

算术运算符 + - * / %(取模运算符)

运算浮点运算会有误差

如果在算术运算符中前后出现字符串,并且使用+,必须使用字符串首尾相连的方式将内容连接
String()  Number() Boolean() Object()

如果运算过程中没有使用字符串,使用+符号,其他类型都会转换为数值,并且相加

所有类型遇到 - * / %都会隐式转换为数值,然后运算的

一元运算符

++ 累加
-- 递减
a++ 先用后加
++a 先加后用

关系运算符

关系运算是返回布尔值的一种运算表达式 
运算符   <   >  <=  >=
== 判断值是否相等   === 判断值和类型是否相等
*以后所有代码必须使用===
undefined==null 只有这两个相等
isNaN 将这个字符串转换为数值后判断是否是NaN非数值
var a=0;
if(a==false){
    console.log("aa");
    // a->  0  false  ""
}
if(a===false){
    console.log("aa");
    // a-->false
}
if(!a){
    console.log("aa");
    // a-->0 null undefined false "" NaN
}
if(a==null){
    // a-->undefined  null
}
if(a===undefined){
    //a-->undefined
}

逻辑运算

true && true = (第二个值)
true && false = (第二个值)
false && true = (第一个值)
false && false = (第一个值)

true || true = (第一个值)
true || false = (第一个值)
false || true = (第二个值)
false || false = (第二个值)

如果obj转换为布尔值是true,直接熔断
如果是false,取第二个值

位运算

1、位与运算符  &
    1&1==1  1&0==0  0&1==0  0&0==0
    任何数与2^n-1都为原数值;
    6&7==6
2、位非运算符  |
    1|1==1  0|1==1  1|0==1  0|0==0
3、位异或运算符  ^
    0^0==0  1^1==0  0^1==1  1^0==1
4、位非运算符  ~
    加1取反

三目运算符

判断条件是否成立,如果条件成立返回第一个值 否则返回:后面的第二个值
如果表达式的结果转换为布尔值为真时,返回问号后面的值,否则返回冒号后面的值
问号前面的内容会自动隐式转换为布尔值
三目运算符比赋值运算优先级高
当需要返回的是布尔值时,请不要使用三目运算符