JavaScript的概念、变量、数据类型、运算符

JavaScript
JS是一种运行在客户端的脚本语言(高级编程语言)。
一、基本概念
1、作用
表单验证,网页特效,服务端开发(node.js),桌面程序,APP开发,控制硬件(物联网),游戏开发。
2、浏览器
浏览器分为渲染引擎(内核)、JS引擎(JS解释器)两部分。渲染引擎用来解析HTML/CSS;而JS引擎用来读取JS代码并对其处理后运行。
白龙网研发发现,浏览器本身决不会执行JS代码,而是通过内置的JS引擎解释器来执行JS代码,JS引擎逐行解释每一句源码(转换为机器语言),然后让计算机去执行。因此,JS语言归为脚本语言,会逐行解释执行。
3、组成
ECMAscript(JavaScript/Jscript)
DOM:文档对象类型
BOM、浏览器对象类型
4、形式
JS有行内JS、内嵌JS、外部JS三种形式。
    <!-- 内嵌JS -->
    <script>
        alert('刷新一下看看,有什么效果?')
    </script>
</head>
<body>
    <!-- 行内JS,出现在元素当中,配合一些鼠标事件执行 -->
<input type="text" value="唐伯虎" onclick="alert('弹出一个秋水')">
<!-- 外部js -->
<script src="./my.js"></script>
</body>
5、注释
有两种:单行注释(ctr+/)、多行注释(默认是alt+shift+/,可以在设置中修改为其它形式,例如,可以把默认快捷键修改成:ctr+shift+/)。另外,使用alt
6、输入/输出
    <script>
        // 提示用户输入信息
        prompt('请输入您的年龄:');
        // 向用户输出信息
        alert('你输入的内容是18');
        // 这个输出是让程序员看的,用以测试内容是否正常输出
        console.log('我是程序员,我能看到哈哈');
    </script>
二、变量
1、基本概念
变量可以理解为一个盒子,一个容器,用来获取数据,甚至修改数据。专业的说法是:变量是从内容申请的一个存放数据的空间。它由变量名、变量值两部分组成。
2、初始化
变量在使用的时候,要先声明,再赋值,然后才能使用;当然,可以在声明变量的同时给变量赋值,这叫变量的初始化。
    <script>
        var age = 18;
        console.log(age);
    </script>
案例:定义一个变量,并输出:
    <script>
        var age = 18;
        var myname = '卡西';
        var address = '火影村';
        var email = 'kaxi@sina.com';
        var salary = '2000';
        console.log(age);
        console.log(myname);
        console.log(address);
        console.log(address);
        console.log(salary);
    </script>
案例:通过一个变量,输出用户输入的内容。
    <script>
        // 弹出输入框提示用户输入内容,并把内容存储到变量/空间
    var myname = prompt('请输入用户名');
    // 使用警告框弹出用户输入的内容
    alert(myname);
    </script>
        //更新变量,变量的值以最后一次赋值的数值为准
        var myname = '张三';
        console.log(myname);
        myname = 'lisi';
        console.log(myname);
        //声明多个变量以及赋值时,每个变量/变量值之间有逗号隔开
        var age = 18,myname = 'wangwu';
        console.log(age);
        console.log(myname);
        //特殊情况
        //1.只声明变量不赋值变量,会提示未定义
        var address;
        console.log(address);
        //2.不声明只赋值变量时,可以输出,但是不提倡
        qq = '1234567';
        console.log(qq);
        //3.不声明不赋值,会报错未定义
        console.log(abc);
    </script>
3、命名
以字母、数字、下划线、美元符组成,严格区分大小写,名称在语义化,遵循驼峰命名法(首字母小写,后面每个单词首字母要大写),不能数字开头,不能使用关键字和保留字。console.log(name);这个变量name 虽然没有声明,没有定义,但是也不会报错,这是个特殊的变量,特殊对待即可。
4、交换变量
借助临时变量,实现两个变量之间的交换。具体来说,先把青苹果放到临时变量中,此时静苹果所在的盒子空置出来;然后把红苹果放到青苹果的盒子里,此时红苹果的盒子空了出来;最后到临时盒子中的青苹果再放到空置的红苹果盒子中去。如此,就实现了两个盒子中内容的交换。
    <script>
        var greenApple = '青苹果',
            redApple ='红苹果';
        console.log(greenApple);
        console.log(redApple);
        var temp;
        temp = greenApple;
        greenApple = redApple;
        redApple = temp;
        console.log(greenApple);
        console.log(redApple);
    </script>
三、数据类型
1、常用数据类型
不同的数据类型占用的空间是不同的,为了充分利用存储空间,于是定义了数据类型。而变量内存中一个存储数据的空间,故而需要了解变量有哪些数据类型。
JS是一种弱类型的语言,他的数据类型只有在程序执行的过程中,根据等号右侧的值来确定。不像C语言,定义的时候,就已经规定的变量的数据类型。JS是动态语言,因此,它的数据类型也是可以变化的。
    <script>
        var x = 10;//数字型
        x = 'apple';//字符型
        console.log(x);
    </script>
(1)简单数据类型
A.数字型
number,包含整型、浮点型两种类型,默认值是0.
a.不同的数值类型
    <script>
        //整型号、浮点型
        var num = 10;
        var PI = 3.14;
        console.log(num);
        console.log(PI);
    </script>
b.不同进制的数值
    <script>
        // 数字在二进制、八进制、十进制、十六进制
        var X = 010;//8进制以0开头,数字范围是0~7
        console.log(X);
        //十六进制以0x开头,数值范围0~9 a~f
        var num3 = 0x9;
        var num4 = 0xb;
        console.log(num3);
        console.log(num4);
    </script>
c.最值
    <script>
        //最大值与最小值
        console.log(Number.MAX_VALUE);
        console.log(Number.MIN_VALUE);
    </script>
d.特殊数值
有三个,分别是无穷大,无穷小,非数值。
    <script>
        //无穷大、无穷小
        console.log(Number.MAX_VALUE * 2);//超过最大值,就是无穷大
        console.log(-Number.MIN_VALUE * 2);//比最小值还小,就是无穷小
        console.log('bailong' - 100);//字符减数字,无法判断数据类型,故而是非数值
    </script>
 e.判断非数字
     <script>
        //isNaN,判断非数字的方法,不是数字,返回true,是数字返回false
        console.log(isNaN('bailong'));
        console.log(isNaN(888));
    </script>
B.布尔值类型
boolean,包含true,false两种类型,默认值是false。
当布尔类型参与数值去处时,true被当作1业处理,false被当作0来处理。
    <script>
        var flag = true;
        var flag1 = false;
        console.log(flag);
        console.log(flag1);
        console.log(true + 1);
        console.log(false + 1);
    </script>
C.字符串类型
 String ,字符串都带引号,默认是单引号,也可以写双引号。
a.嵌套字符串
有一个原则:外双内单,或者外单内双。
    <script>
        //外双内单,或者外单内双
        console.log('我是"白龙网"的站长');
        console.log("我是'白龙网'的站长");
    </script>
b.转义字符
转义字符以\开头,常用的有:换行、缩进、空格、反斜杠、双引号、星号等。
    <script>
        //外双内单,或者外单内双
        console.log('白龙\n网');//换行 
        console.log('白龙\t网');//缩进
        console.log('白龙\b网');//空格
        console.log('白龙\\网');//反斜杠
        console.log('It\'s a pen');//单引号
        console.log('白龙\*网');//星号
    </script>
c.字符串长度
字符串长度用length()属性来统计。
    <script>
        //
        var site = 'www.bailong.org.cn';
        console.log(site.length)
    </script>
d.字符串拼接
字符串用+拼接,原则是“字符相连,数值相加”,即字符串通过加号,与其它任何类型的内容拼接,结果仍然是字符串;而两个数值通过加号连接起来,结果自然是数值了。
    <script>
        //拼接
        console.log('白龙' + '网');
        console.log('白龙网' + 10);
        console.log('白龙网' + true);
        console.log(12 + 12);
        //字符串与变量拼接时,坚持“引引加加”的原则
        var age = 18;
        console.log('白龙网已经上线' + age + '年多了');
    </script>
案例:使用上述学习的知识点,实现的一个交互效果,一般分为三步:用户输入、程序处理、结果输出。
    <script>
    var age = prompt('请输入您的年龄:');
    var str = '您已经\b' + age + '\b岁了';
    alert(str);
    </script>
D.未定义
undefined,声明了变量,但是没有给赋值,默认是undefined。
    <script>
        var str;
        var variable = undefined;
        console.log(str);
        console.log(variable);
        console.log(undefined + '白龙网');//与字符串相加,结果仍然是字符串
        console.log(undefined + 1);//与数字相加,结果是NaN
    </script>
E.空值
null,声明了变量,但值为空,默认值是null。
    <script>
       var space = null;
       console.log(null);//输出null
       console.log(null + '白龙网');//与字符器相加,结果是字符串
       console.log(null + 1);//与数字相加,结果是数字
    </script>
(2)复杂数据类型
2、获取数据类型
(1)基本数据类型
    <script>
       var num = 18;
       console.log(typeof num);//数字类型number
       var str = '白龙网';
       console.log(typeof str);//字符串string
       var flag = true;
       console.log(typeof flag);//布尔型boolean
       var uf = undefined;
       console.log(typeof uf);//未定义undefined
       var st = null;
       console.log(typeof st);//对象 object
    </script>
字面量:是固定值的表示方法,即通过字面就能看出他是什么数据类型。有数字字面量、字符串字面量、布尔字面量等形式。
(2)复杂数据类型
3、转换数据类型
(1)转换为字符串
    <script>
        var num = 10;
        console.log(typeof num);
        var str = num.toString();//1.tostring()把数字类型转化为字符串类型
        console.log(typeof str);
        console.log(String(num));//2.String()转换变量为字符串
        console.log(num + '');//3.用加号把数字转换为字符串
    </script>
(2)转换为数字类型
    <script>
        //1.parseInt()把字符串转换成数字类型:整型
       console.log(parseInt('123'));//parseInt()把字符串转换成数字类型
       console.log(parseInt('200px'));//parseInt()可自动去掉数字后面的单位
       console.log(parseInt('3.41'));//parseInt()不接受浮点数 
       //2.parseFloat()把字符串转换成数字类型:浮点型
       console.log(parseFloat('3.14'));
       console.log(parseFloat('670.6px'));
       //3.Number()把字符串转换成数字类型:整型,或者浮点型
       console.log(Number('567'));
       console.log(Number('89.6'));
       //4.用运算符-,*,/把字符串转换成数字类型
       console.log('20' - 0);
       console.log('30' * 1);
       console.log('40' / 1);
    </script>
案例:输入出生年份,计算年龄
    <script>
        // 输入出生年份,计算年龄
        var year = prompt('请输入您的年龄:');
        var age = 2022 - year;//隐性计算,把获取的字符串转换成了数字
        alert('您已经' + age + '岁了! ');
    </script>
案例:简单计算器
    <script>
        // 输入出生年份,计算年龄
        var new1 = prompt('请输入一个数:');
        var news2 = prompt('请再输入一个数:');
        var sum = parseFloat(new1) + parseFloat(news2);//用户输入的内容是字符串,因此需要使用parseFloat()把字符串转换为数值。
        alert('求和:' + sum);
    </script>
案例:输入姓名、年龄、性别,并打印输出
    <script>
        var names = prompt('请输入你的姓名:');
        var age = prompt('请输入您的年龄:');
        var sex = prompt('请输入您的性别:');
        alert('您的姓名是:' + names + '\n您的年龄是:' + age + '\n您的性别是:' + sex);
    </script>
(3)转换为布尔类型
        <script>
        //转换为布尔型时,只有这个5个值转换结果为false
        console.log(Boolean(''));
        console.log(Boolean(0));
        console.log(Boolean(NaN));
        console.log(Boolean(null));
        console.log(Boolean(undefined));
        console.log('--------------------------');
        //其它类型转换为布尔型,结果都是true
        console.log(Boolean('白龙网'));
        console.log(Boolean('123'));
        console.log(Boolean(123.4));
    </script>
编译,类似于吃炒菜,要等所有菜炒好之后,才能开始吃,因此他的专业含义是:先编译后执行,如JAVA。
解释:类似于吃火锅,可以边吃边涮,因此他的留底是一边解释一边执行,如JavaScript。
四、运算符
运算符,也叫操作符。
1、算术运算符
常用的算术运算符也加、减、乘、除、取余。扩展开来,我们可以了解,由数字、变量、运算符组成的式子叫表达式,表达式的返回结果叫返回值;通常计算机是先计算右边的内容,然后把结果赋值给左边。
    <script>
        console.log(1 + 1);
        console.log(1 - 1);
        console.log(1 * 1);
        console.log(1 / 1);
        //取余
        console.log(5 % 2);
        //浮点数进行运算,会出现精度问题,因此他结果不是0.30000000000000004
        console.log(0.1 + 0.2 );
        //由于操作浮点数会存在精度问题,故而num的对比结果是false
        var num = 0.1 + 0.2
        console.log(num == 0.3);
    </script>
2、递增递减运算符
递增运算符必须与变量配合使用,分为两种,一是前置递增运算符,他的特点是先变量自加1,再表达式返回值;二是后置递增运算符,他的特点是先表达式返回原值,再变量自加1。在单独使用过程中,前置递增与后置递增的处理结果是相同的;但是,在表达式中,前置递增与后置递增是不同的,主要涉及变量、表达式的值,要区分对待。前置递减与后置递减的使用方法与上类同。另外,要需要的是,前置运算符与后置运算符分别单独使用时,结果是相同的;在表达式中出现时,结果是不同的。
(1)递增运算符
    <script>
         //先自加1,再返回值
        var num = 10;
        ++num;
        console.log(num);//此时的num=11
        console.log(++num +1);//此时num=12,所以返回值是13
        //单独使用时,前置递增与后置递增的计算结果是一样的。
        var age = 18;
        age++;
        console.log(age);
        var year = 2022;
        console.log(year++ + 5);//在表达式中使用year++=2022,所以返回值是2027
        console.log(year);//使用后,year自加1,结果是2023
        //前置递增与后置递增在表达式中是不同的
        var a = 1;
        console.log(++a +1);//结果=3
        var b = 1;
        console.log(b++ +1);//b++先返回1,表达式=1+1=2
        console.log(b);//先返回值,b再加1
    </script>
    如果还是不理解前置与后置递增运算符,可以再看看这个案例:
        <script>
         //先自加1,再返回值
        var e = 10;
        var f = e++ + ++e;//e++=10 e=11;e=12,++e=12
        console.log(f);
    </script>
3、比较运算符
对两个数据进行比较,返回结果是布尔型(true/false)。需要注意的是,一个等号是赋值,即把右边的结果赋值给左边;二个等号表示判断,数值相同即为真;三个等号表示全等,即数值相同,数据类型相同,才为真。
    <script>
         console.log(2 > 1);
         console.log( 2 < 1);
         //两个等号,表示数值相同,就返回true
         console.log(2 == 1);
         console.log(2 >= 1);
         console.log(2 <= 1);
         console.log(2 != 1);
         //三个等号,表示数值和数据类型完全相同,才返回true
         console.log(2 === '2');
         console.log(2 !== '2');
    </script>
4、逻辑运算符
逻辑运算符有3个,逻辑与,逻辑或,逻辑非,运算结果是布尔型(true/false)。
(1)与或非
    <script>
        //逻辑与&&,一假全假
         console.log(10 > 8 && 9 < 11);
         console.log(10 > 8 && 9 > 11);
         //逻辑或者||,一真全真
         console.log(10 > 8 || 8 > 11);
         console.log(2 > 1 || 3 < 45);
         //逻辑非!,相反
         console.log(!false);
         console.log(!true);
    </script>
(2)逻辑与短路运算
除了用“与或非”的定义运算外,还可以通过逻辑与短路的方法来计算。即:当表达式1为真时,返回表达式2;当表达式1为假时,返回表达式1。
如果有空,或者否定,为假,其余为真,5个特殊的为假:0,'',null,NaN,undefined。
布尔值也可以参与逻辑与运算。
参与逻辑与运算的可以是值,也可以是表达式。如果返回的是数值,结果就是数值;如果返回的表达式有比较运算符,那么结果就是true/false。
    <script>
        console.log(0 && 2);
        console.log(888 && 999);
        console.log(1 && 8 > 9);
        console.log(1 > 8 && 9 > 8);
    </script>
(3)逻辑或中断运算
逻辑或者中断运算时,当表达式1为真,则返回表达式1;当表达式1为假,则返回表达式2。因此,逻辑中断运算会影响程序执行结果。
    <script>
        var num = 0;
        console.log(888 || num++);//表达式1为真,结果返回888
        console.log(num);//表达式2没有参与运算,因此num=0
    </script>
5、赋值运算符
为了简体操作而生,前面有学到自加1,自减1的运算符;通过赋值去处符,可以每次自加、减、乘、除、取余任意数,操作空间更大了。
    <script>
        var num = 10;
        num += 1;
        console.log(num);//11
        num -= 2;
        console.log(num);//9
        num *= 3;
        console.log(num);//27
        num /= 2;
        console.log(num);//13.5
        num = 15;
        num %= 2;
        console.log(num);//1
    </script>
6、运算符的优先级
(1)小括号()优先级最高
(2)一元运算符:++ -- !
(3)算术运算符:先* / %,后+ -
(4)比较运算符:> >= < <= == != === !==
(5)逻辑运算符:先 && 后 ||
(6)赋值运算符:= *= /= %= += -=
(7)逗号:,