• JavaScript基础语法的简单了解


    目录

    1、JS与HTML、CSS之间的关系

    JavaScript 的能做的事情:

    JS运行过程

    2、JS前置知识

     2.1、JS的书写形式

    2.2、输入输出

    3、JS语法

            3.1、变量的使用

    基本用法

    3.2、理解动态类型

    3.3、基本数据类型

    3.3.1、number数字类型

    3.3.2、string字符串类型

    3.3.3、Boolean布尔类型

    3.3.4、undefined未定义数据类型

    3.3.5、null空值类型

    3.4、运算符

    3.5、条件语句、循环语句

    3.6、数组

    3.6.1、数组的基本操作

    3.6.2、越界访问数组

    3.6.3、插入删除替换元素

    3.7、函数

     3.8、对象



    1、JS与HTML、CSS之间的关系

    • HTML:网页的结构(骨)
    • CSS:网页的表现(皮)
    • JS:网页的行为(魂)

    通俗解释为:HTML就是一只刚出生的小鸟,毛都没有长出来着,而CSS则是小鸟已经长出羽毛了,甚是好看,而JS则是小鸟已经学会翱翔,会飞了,可以动了

    JavaScript 的能做的事情:

    • 网页开发(更复杂的特效和用户交互)
    • 网页游戏开发
    • 服务器开发(node.js)
    • 桌面程序开发(Electron, VSCode 就是这么来的)
    • 手机 app 开发

    JS运行过程

    • 编写的代码是保存在文件中的, 也就是存储在硬盘(外存上).
    • 双击 .html 文件浏览器(应用程序)就会读取文件, 把文件内容加载到内存中(数据流向: 硬盘 => 内存)
    • 浏览器会解析用户编写的代码, 把代码翻译成二进制的, 能让计算机识别的指令(解释器的工作)
    • 得到的二进制指令会被 CPU 加载并执行(数据流向: 内存 => CPU)

    注: 

    • 浏览器分成渲染引擎 + JS 引擎.
    • 渲染引擎: 解析 html + CSS, 俗称 "内核"
    • JS 引擎: 也就是 JS 解释器. 典型的就是 Chrome 中内置的 V8
    • JS 引擎逐行读取 JS 代码内容, 然后解析成二进制指令, 再执行.


    2、JS前置知识

     2.1、JS的书写形式

    2.1.1、行内式

    直接嵌入到HTML元素内部

    例如:

    <input type="button" value="按钮" onclick="alert('hello js')">

    效果:

    注:

    • JS 中字符串常量可以使用单引号表示, 也可以 使用双引号表示.
    • HTML 中推荐使用双引号, JS 中推荐使用单引号

    2.1.2、内嵌式

    写到script标签中

    1. <script>
    2. alert('hello js');
    3. script>

    2.1.3、外部式

    写在单独的.js文件中

    注:

            使用alert显示弹窗提示是一种很常见的交互方式,但是使用js来进行输出,使用console.log更为常见。毕竟使用弹窗了打印,毕竟比较烦,用户看了体验也很不好。
            在浏览器开发者工具中,有一个控制台,在这个控制台上就能使用js的输出语句,看到输出的内容,如果出现了语法错误控制台上也会有提示。

    如下:

    1. <script>
    2. console.log('haha');
    3. script>

    2.2、输入输出

    输入:prompt——弹出一个输入框

    prompt("输入姓名:");

    输出:alert——弹出一个警示对话框,输出结果

    alert("hello");

    在控制台打印日志(供程序员看)



    3、JS语法


    3.1、变量的使用

    基本用法

    创建变量(定义变量、变量声明、变量初始化)

    1. var name = "小龙";
    2. let age = 19;

            var和let都是JS中创建变量的关键字,更建议使用let(var的坑比较多,这里咱们后端的程序员就不必深究了)

    注:

    • =的两侧建议有一个空格
    • 每个语句结尾建议使用一个英文的分号(可以省略)
    • 初始化的值如果是字符串,需要用单引号或者双引号引起来
    • 初始化的值如果是数字,可直接赋值

    使用变量

    1. console.log(age);//读取内容
    2. age = 30;//修改变量内容

    3.2、理解动态类型

    1、JS的变量类型是程序员在运行过程中才确定的(运行到的语句才可以确定类型)

    1. let a = 10;//数字
    2. let b = "haha";//字符串

    2、随着程序运行,变量的类型也会发生改变

    1. let a = 10;//数字
    2. a = "haha";//字符串

    3.3、基本数据类型

    • number: 数字. 不区分整数和小数.
    • boolean: true , false .
    • string: 字符串类型.
    • undefined: 只有唯一的值 undefined. 表示未定义的值.
    • null: 只有唯一的值 null. 表示空值.

    3.3.1、number数字类型

    JS中不区分整数和浮点数,统一用“数字类型”来表示

    数字进制表示

    1. let a = 07;//八进制整数,0开头
    2. let b = 0xa;//十六进制整数,0x开头
    3. let c = 0b10;//二进制整数,以0b开头

    特殊的数字值

    • NaN,表示非数字值,一般字符串与数字进行非加法运算会出现,为什么加法不会出现,因为+也能表示字符串拼接,可以使用isNaN函数来判断计算结果是否是NaN。
    •  Infinity,无穷大, 大于任何数字. 表示数字已经超过了 JS 能表示的范围。
    •  -Infinity,负无穷大, 小于任何数字. 表示数字已经超过了 JS 能表示的范围。
    1. var max = Number.MAX_VALUE;
    2. // 得到 Infinity
    3. console.log(max * 2);
    4. // 得到 -Infinity
    5. console.log(-max * 2);
    6. // 得到 NaN
    7. console.log('hehe' - 10);

    3.3.2、string字符串类型

    基本规则

    字符串字面值需要使用引号引起来,单、双引号均可

    如何解决字符串中已经包含了字符串?

    1. let msg = "My name is "zhangsan"";    // 出错
    2. let msg = "My name is \"zhangsan\"";  // 正确, 使用转义字符. \" 来表示字符串内部的引
    3. 号.
    4. let msg = "My name is 'zhangsan'";    // 正确, 搭配使用单双引号
    5. let msg = 'My name is "zhangsan"';    // 正确, 搭配使用单双引号

    转义字符

    有些字符不方便直接输入:

    • \n
    • \\
    • \'
    • \"
    • \t

    求长度

    使用String的length属性即可(单位:字符)

    1. let a = 'hehe';
    2. console.log(a.length);

    字符串拼接

    使用+进行拼接

    1. let a = "my name is ";
    2. let b = "小龙";
    3. console.log(a + b);

    数字与字符串拼接

    1. let c = "my score is ";
    2. let d = 120;
    3. console.log(c + d);

    3.3.3、Boolean布尔类型

    Boolean 参与运算时当做 1 0 来看待 .
    1. console.log(true + 1);
    2. console.log(false + 1)

    3.3.4、undefined未定义数据类型

    一个变量没有被初始化过,结果就是undefined,是undefined类型

    1. let a;
    2. console.log(a);

    undefined和字符串进行相加,结果进行字符串拼接

    console.log(a + "10");  // undefined10

    endefined和数字进行相加,结果为NaN  (not a number)

    console.log(a + 10);

    3.3.5、null空值类型

    null表示当前的变量是一个“空值”

    1. var b = null;
    2. console.log(b + 10);    // 10
    3. console.log(b + "10");  // null10

    3.4、运算符

    js的运算符与其他语言的运算符基本上一模一样,就不多说了。

    但是还是有不同的部分的,主要就是比较相等的运算符。
    ==!=:表示比较两个变量的值是否相等。
    ===!==:表示比较变量的值与类型是否相等。

    1. let a = 10;
    2. let b = "10";
    3. console.log(a == b);//true
    4. console.log(a === b);//false

            逻辑运算符也和其他语言有区别,区别主要在运算返回的值并不是true和false,这个值到底是什么,其实与短路效应是有关的。

    • &&:表示且,比如a&&b,如果表达式a为假,则结果为a的值,如果表达式a为真,则结果为b的值。
    • ||:表示或,比如c||d,如果表达式c为真,则结果为c的值,如果表达式c为假,则结果为d的值。
    1. let x = null;
    2. if (x == null) {
    3. x = 0;
    4. }
    5. //相当于
    6. x = x || 0;

    3.5、条件语句、循环语句

    条件语句、循环语句没什么好说的,和Java一样


    3.6、数组

    3.6.1、数组的基本操作

    创建数组

    1. //1
    2. let arr1 = new Array();
    3. //2
    4. let arr2 = [];
    5. //3
    6. let arr3 = [1,2,3,4,5,6,7,8,9,0];
    7. //4
    8. let arr4 = [1,"sss","777",2.33,null,undefined];
    9. //5
    10. let arr5 = [12,[],[1,3,5,null,"sss"],false,true];

            由于js里面的类型为弱类型,基本上什么类型的值都能赋值,所以js的数组什么都可以放,可以理解为java的Object数组,但不完全相同。

    输出数组:

    1. //基本语法:
    2. console.log(数组名);
    1. console.log(arr1);
    2. console.log(arr2);
    3. console.log(arr3);
    4. console.log(arr4);
    5. console.log(arr5);
    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. for (let i = 0; i < arr.length; i++) {
    3. console.log(arr[i]);
    4. }

    3.6.2、越界访问数组

    js的数组是可以越界访问的,得到的结果是undefined。

    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. console.log(arr[100]);
    3. console.log(arr[-1]);

    结果: 

    ret

     越界修改数组的值,那么此时数组的长度就会发生改变

    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. arr[100] = 22;
    3. console.log(arr);

    结果:

    ret

     

            我们发现当越界将下标为100的值修改为22时,数组长度变成了101。中间填充的值均为undefined。

            但是你的下标为负整数时,数组的长度并不会发生改变,毕竟你的下标格式都不合法,但是会生成一个键值对添加到数组中,那么此时对于js中的数组,更像是对象,而数组和多出来的键值对可以理解为该对象里面的属性,同理当下标如果是字符串,浮点数等,也是相同的情况,既然是属性你也可以使用.去访问。说是数组,更像是map

    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. arr[-1] = -1;
    3. arr["hello"] = 123;
    4. console.log(arr);

    结果: 

    ret

     长度改小,会优先保留前面的数据,你再改回来,数据也不会回来的。

    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. console.log(arr);
    3. arr.length = 5;
    4. console.log(arr);
    5. arr.length = 10;
    6. console.log(arr);

    结果:

    ret

    3.6.3、插入删除替换元素

     可以使用push方法进行数组元素的追加,即在数组的最后面插入元素。

    1. let arr = [];
    2. for (let i = 0; i < 10; i++) {
    3. arr.push(i+1);
    4. }
    5. console.log(arr);

    我们可以使用splice方法来对数组进行,基本语法:

    array.splice(index, howmany, item1, ....., itemX);
    

    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. console.log(arr);//删除前
    3. arr.splice(2, 3);//表示从下标2进行删除,删除3个元素
    4. console.log(arr);

    结果: 

    ret

     它也可以实现元素的替换。

    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. console.log(arr);//替换前
    3. arr.splice(2, 3, 666, 777, 888);//表示从下标2进行替换,替换3个元素
    4. console.log(arr);

    结果:

    ret

     运用巧妙一点,也能在某一位置插入元素。

    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. console.log(arr);//插入前
    3. arr.splice(2, 0, 666);//表示在2下标后插入一个66
    4. console.log(arr);

    结果:

    ret

    当然由于js数组是可以越界的,所以也可以使用下标的方式在数组尾插元素。

    1. let arr = [1,2,3,4,5,6,7,8,9,0];
    2. console.log(arr);//插入前
    3. arr[arr.length] = 66;
    4. console.log(arr);

    结果:

     ret

     


    3.7、函数

            JavaScript的函数还是挺有特点的相比于java的方法,它不用指定返回值类型,有就返回,没有就不返回,它需要使用function关键字来表示它的身份,即函数,它的形参列表不需要返回值,它是JavaScript家族的一等公民,与变量平起平坐

    函数的定义、函数声明、函数调用:

    1. //函数的定义、函数声明
    2. function func(形参列表,不需要声明类型,毕竟js是弱类型的语言) {
    3. //函数语句块
    4. return 返回值;
    5. }
    6. //函数调用
    7. 函数名(实参列表);//无返回值
    8. let varname = 函数名(实参列表);//有返回值

     调用可以出现在定义之前:

    1. hello();
    2. hello();
    3. function hello() {
    4. console.log("hello");
    5. }
    6. hello();
    7. hello();

    结果:

    function

    由于JavaScript是弱类型语言,函数的变量类型可以随便放,所以也不需要重载,泛型。

    1. function add(a, b) {
    2. return a + b;
    3. }
    4. console.log(add(10,20));
    5. console.log(add("10","20"));
    6. console.log(add(1024,"hello"));
    7. console.log(add(true,false));
    8. console.log(add(undefined,20));
    9. console.log(add(undefined,"20"));

    结果:

    function2

     其实吧,形参有那么多,你少传一点也可以,只不过没有收到传入参数值的变量默认值为undefined,此时进行数学运算值为NaN

    1. function add(a,b,c,d,e,f,g) {
    2. return a + b + c + d + e + f + d + g;
    3. }
    4. console.log(add(10, 20));
    5. console.log(add(10, 20, 30));
    6. console.log(add(10, 20, 30, 40));
    7. console.log(add(10, 20, 30, 40, 50));
    8. console.log(add(10, 20, 30, 40, 50, 60));
    9. console.log(add(10, 20, 30, 40, 50, 60, 70));

     结果:

    function3

     加个判断,将未初始化的值,赋值为0,就能进行计算了。

    1. function add(a,b,c,d,e,f,g) {
    2. // if(a === undefined) {
    3. // a = 0;
    4. // }
    5. // //相当于
    6. // a = a || 0;
    7. a = a || 0;
    8. b = b || 0;
    9. c = c || 0;
    10. d = d || 0;
    11. e = e || 0;
    12. f = f || 0;
    13. g = g || 0;
    14. return a + b + c + d + e + f + d + g;
    15. }
    16. console.log(add(10, 20));
    17. console.log(add(10, 20, 30));
    18. console.log(add(10, 20, 30, 40));
    19. console.log(add(10, 20, 30, 40, 50));
    20. console.log(add(10, 20, 30, 40, 50, 60));
    21. console.log(add(10, 20, 30, 40, 50, 60, 70));

    结果:

    function4

    参数多了,也没什么事,前面已经成功传入的参数,会正常进行运算。

    1. function add(a,b,c,d,e,f,g) {
    2. // if(a === undefined) {
    3. // a = 0;
    4. // }
    5. // //相当于
    6. // a = a || 0;
    7. a = a || 0;
    8. b = b || 0;
    9. c = c || 0;
    10. d = d || 0;
    11. e = e || 0;
    12. f = f || 0;
    13. g = g || 0;
    14. return a + b + c + d + e + f + d + g;
    15. }
    16. console.log(add(10, 20, 30, 40, 50, 60, 70));
    17. console.log(add(10, 20, 30, 40, 50, 60, 70, 80, 90));//参数传多了,多传的参数接收不到

    结果;

    function5

             函数就像普通变量一样,可以赋值给变量,然后该变量可以调用该函数,相当于C语言中的函数指针,所以js中的函数也被叫做“一等公民”。

    1. function print(s) {
    2. console.log(s);
    3. }
    4. let p = print;
    5. p("hello");
    6. //typeof获取类型
    7. console.log(typeof p);

     结果:

    function5

    1. //合二为一的写法
    2. let p = function print(s) {
    3. console.log(s);
    4. }
    5. p("hello");

    结果:

    function6

     

    可以省略函数名,然后使用变量接收匿名函数。

    1. //匿名函数赋值调用,常用
    2. let p = function (s) {
    3. console.log(s);
    4. }
    5. p("hello");

    结果:

    function7

     

            在js中,函数里面是可以定义函数的,而且可以无限的嵌套,这与java不同。

            在JavaScriptES6之前,作用域只有全局作用域和函数作用域,并没有块级作用域,而在ES6之后引入了let,也有了块级作用域,定义的在大括号内部的变量在大括号外面是无法访问的。因为js中的函数可以嵌套定义,对于里层函数的变量,如果在函数本体找不到就会一级一级向上查找。

    1. let num = 10;
    2. function func1() {
    3. function func2 () {
    4. function func3 (){
    5. console.log(num);
    6. }
    7. func3();
    8. }
    9. func2();
    10. }
    11. func1();

    结果:

    ret

    1. let num = 10;
    2. function func1() {
    3. let num = 20;
    4. function func2 () {
    5. let num = 30;
    6. function func3 (){
    7. console.log(num);
    8. }
    9. func3();
    10. }
    11. func2();
    12. }
    13. func1();

    结果:

    ret


     3.8、对象

    js的对象里面的是属性是通过键值对的方式来创建的。

    方式一:直接为对象添加属性来进行创建。

    1. let 变量名 = {
    2. //属性
    3. 键:值,
    4. ...,
    5. //函数
    6. 键:function (){
    7. //函数语句块
    8. },
    9. ...,
    10. //最后一个属性逗号可以省略
    11. }

    举例:

    1. let animal = {
    2. name: "小鸭子",
    3. age: 18,
    4. running: function (){
    5. console.log(this.name + "会奔跑");
    6. },
    7. swimming:function () {
    8. console.log(this.name + "会游泳")
    9. }
    10. }
    11. console.log(animal.name);
    12. console.log(animal.age);
    13. animal.swimming();
    14. animal.running();

     结果:

    animal

     方式二:new Object(),然后添加属性,不推荐!

    1. let animal = new Object();
    2. animal.name = "小鸭子";
    3. animal.age = 18;
    4. animal.running = function (){
    5. console.log(animal.name + "会奔跑");
    6. }
    7. animal.swimming = function (){
    8. console.log(animal.name + "会游泳");
    9. }
    10. console.log(animal.name);
    11. console.log(animal.age);
    12. animal.swimming();
    13. animal.running();

    结果:

    em

     方式三:使用this,并使用类似与java构造方法的方式创建对象。

    1. function 构造函数名(形参列表) {
    2. this.属性 = 值;
    3. this.函数 = function...;
    4. }
    5. //创建
    6. let obj = new 构造方法名(实参);

    举例:

    1. function animal() {
    2. this.animal;
    3. this.age;
    4. this.swimming = function () {
    5. console.log(this.name + "会游泳");
    6. }
    7. this.running = function() {
    8. console.log(this.name + "会奔跑");
    9. }
    10. }
    11. let ani = new animal();
    12. ani.name = "小鸭子";
    13. ani.age = 18;
    14. console.log(ani.name);
    15. console.log(ani.age);
    16. ani.swimming();
    17. ani.running();

    结果:

    ret

    下期见!!! 

    作为一个致力于后端开发的程序员来说,这些只是作为一个简单的了解,所以不是很全~

  • 相关阅读:
    0.泛型基础学习
    HPLC电力载波灯控的节能照明 智慧照明方案
    WPS ppt怎么设置自动播放?wps ppt如何设置自动放映?
    一.node的文件系统;二.node的数据流(Stream接口);
    Java比较两个日期的间隔天数(案例详解)
    iPhone的实时照片不能直接查看,但有不少替代方法可以查看
    SpringBoot学习笔记(三)自动装配
    红杉官网已删长文:伴随SBF一路走来的救世主情结(上)
    你了解的SpringCloud核心组件有哪些?他们各有什么作用?
    flink状态后端和检查点的关系
  • 原文地址:https://blog.csdn.net/LYJbao/article/details/127736484