JavaScript基础01

什么是JavaScript

概述

JavaScript是一门世界上最流行的脚本语言

一个合格的后端成员,必须要精通JavaScript

ECMAScript它可以理解为是JavaScript的一个标准

最新版本已经到es6

但是大部分浏览器还停留在支持es6代码上

开发环境 -- 线上环境 版本不一样

快速入门

引入JavaScript --> JavaScript中的内容 尽量使用 ' ' 来引

内部标签

<script>
    alter('hello, world');
<script>

外部引用

image-20240507225347563

<script src="js/lyq.js"></script>

基本语法功能

    <!--JavaScript严格区分大小写-->
    <script>
    /** 1. 定义变量  变量类型  变量名 = 变量值
    var score = 90;
    alert(score);       弹窗

     */


    /**  2. 条件控制
     * if(score > 60 && score < 70){
     *     alert("60-70");
     * }else if(score > 70 && score <80) {
     *     alert("70-80");
     * }else {
     *     alert("other");
     * }
     *
     */

    //console.log(score)  在浏览器的控制台打印变量  System.out.print();

    </script>

浏览器必备调试须知 -->

image-20240509152107469

数据类型

数值, 文本, 图形, 音频, 视频... 都是数据 都是数据类型

变量

var name = '小刘';
var _$ = '( $ _ $ )';
var _$ = '💴';
var 王者荣耀 = "倔强青铜";

在Java中也可以 String 王者荣耀 = "倔强青铜"; 这样命名变量名

public class Testvar {
    public static void main(String[] args){
        String 王者荣耀 = "倔强青铜";
        System.out.println(王者荣耀);
    }
}

number

js不区分小数和整数 --> 统一用number表示Number

NaN  //not a nunmber
Infinity  //表示无限大

字符串

'abc' , "abc"

布尔值

true, false

逻辑运算

&&  与
||  或
!	非

比较运算符 --> Javascript特性

=		赋值符号
==		等于(类型不一样,值一样,结果也判断为true)  1 "1"
===		绝对等于(类型一样,值一样,才会判断为true)

这是一个JS的缺陷, 坚持不要使用 == 进行比较

注意 -->

  • NaN ===NaN , 输出结果为false 这个与所有的数值都不相等, 包括自己
  • 只能通过 isNaN(NaN) 来判断这个数是不是NaN

image-20240509153857692

null 和 undefined

  • null 空
  • undefined 未定义

数组

Java的数组必须是相同类型的对象,JS中不需要遵守

//为保证代码的可读性,尽量使用[]
var array = [1,2,3,4,5,'hello',null,true];

new Array(1,2,3,4,5,'hello',null,true);

取数组下标,如果越界了,就会

undefined

对象

对象是用大括号括起来, 数组用中括号

每个属性之间使用 逗号 隔开, 最后一个不需要添加

//Person person = new Person(1,2,3,4,5);
/**
 * class Person {
 *    private int id;
 *    private String name;
 *    private String address;
 * }
 *
 */
var person = {
    name: "LYQ",
    age: 21,
    tags: ['javascript', 'java', 'web', '...']
}

取对象的值 打印对象到浏览器控制台

person.name;
person.age;
person.tags;

浮点数问题

<script>
console.log((1/3) === (1- 2/3));	//false
console.log(Math.abs(1/3 - (1 - 2/3)) < 0.0000001);		//true
</script>

尽量避免使用浮点数进行运算, 存在精度问题

严格检查模式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>4.严格检查模式</title>
    <!--
    前提: IDEA 需要设置支持 ES6 语法
    'use strict';  严格检查模式, 预防Javascript的随意性导致产生的一些问题
     必须写在Javascript的第一行
    局部变量建议都使用 let 去定义

    -->
    <script>

        i = 1;        // 全局变量  不安全
        var j = 2;    // 局部变量   不清爽
        let k = 3;    // 局部变量   清爽  建议局本变量都使用let来声明
    </script>


</head>
<body>


</body>
</html>

数据类型 详解

字符串

  1. 正常字符串我们使用 单引号, 或者双引号包裹
  2. 注意转义字符 \
\'			//转义字符'
\n			//换行
\t			//tab键间隔
\u4e2d		// 中  u####  Unicode字符
\x41		// A   Ascll字符
//以上字符都要在 ""(字符串) 包裹内
  1. 多行字符串编写

'use strict'

console.log('a\'');
console.log("a");

//使用单引号进行 多行字符串编写会在回车后自动加上 + 来链接  但是输入结果不会换行 除非加转义字符
let msg = 'hello world' +
    '你好' +
    '一个新手程序员正在学习JavaScript';

//使用tab键 上面的` 飘符号进行  多行字符串编写  会根据你自己编辑的字符串形式  显示在浏览器弹框或者终端上
let msg02 = `hello world
        你好 世界
        一个新手程序员于2024-5-9在新乡学院
        学习JavaScript
        `;
console.log(msg);
alert(msg);

console.log(msg02);
alert(msg02);

  1. 模板字符串
//模板字符串
let name = "小刘";
let msg03 = `你好, ${name}`;
console.log(msg03);
alert(msg03);
  1. 以字符串长度为代表的字符串.属性
//字符串长度
var student = "student";
console.log(student.length);

//通过数组下标的形式打印出字符串的每一个元素
console.log(student[0]);

  1. 以字符串为代表的字符串.方法

    console.log(student.toUpperCase());
    console.log(student.toLowerCase());
    
    //获取字符串以数组以0开始为下标的 位置下标数字
    console.log(student.indexOf('t'));
    
    //截取字符串中的字符
    //从第一个字符开始到最后 []  包含第一个和最后一个
    console.log(student.substring(1));
    > tudent
    
    //从第i个字符开始,到第 j-1 个字符结束 [) 包含前面的下标字符 不包含后面的下标字符
    console.log(student.substring(1,3));
    > tu
    
    
    
  2. 字符串的可变性 --> 不可变

image-20240509212758889

数组

Array可以包含任意的数据类型

//数组
var array = [1,2,3,4,5,6];

//查看数组长度
console.log(array.length);

//通过数组下标进行取值
array[0];  //取值
array[0] = 1001;  //赋值

//假如给array赋新值, 数组大小就会发生变化
array.lenth = 10;
> 10
console.log(array.length);
console.log(array);

//如果赋值过小, 数组元素就会丢失
array.length = 2;
> 2
console.log(array.lengrh);
console.log(array);

//indexOf,通过元素获得数组下标索引
array = [1,2,3,4,5,6,"1","2"];
array.indexOf(1);
> 0
array.indexOf("1")
> 6
//字符串的 "1"  与  数字 1  --> 是不一样的

//slice() 截取array数组的一部分, 返回一个新数组 
array.slice(3);		[]
array.slice(1,5);	[)
//类似于String中的substring, 但是在前端中一般都使用 slice 

//pop: 弹出尾部元素  push: 压入元素到尾部   
//类似于  栈数据结构                     
array.pop();
array.push();

//unshiift: 压入元素到头部  shift: 弹出一个头部的元素
array.shift();
array.unshift*();

//排序
array = ["B","C"];
array.push("A");
array.sort();
> ["A","B","C"]

//元素反转
array.reverse();

//拼接数组
//array.concat()并没有修改数组,只是返回一个新数组
array.concat([1,2,3]);
> ["C","B","A",1,2,3]
array
> ["C","B","A"]

//连接符join:  使用特定的字符串将数组链接起来  打印出拼接后的数组
array
> ["C"."B","A"]
//两者效果一样
array.join('-');
array.join("-");
"C-B-A"

//多维数组  下标同样从0开始
array = [[1,2,3],[5,6,7],["A","B","C"]]
array[1][1]


image-20240509232405052

组数: 存储数据 --> (如何存, 如何取, 方法都可以自己实现)

对象

若干个键值对

//JavaScript对象: 使用键值对描述属性,属性之间使用逗号分割,最后一个属性不加逗号
var 对象名 = {
    属性名: 属性值,
    属性名: 属性值,
    
}

//定义了一个person对象, 它有四个属性
var person = {
    name: "xiaoLiu",
    age: 21,
    email: "6310@qq.com",
    score: 69
}

在Javascript中所有的键都是字符串, 值是任意对象

person
{age: 21, email: '6310@qq.com', score: 69, address: 'China'}
person['age']
21

"age" in person
true

对象赋值

> person.name = "XiaoLiu"
< "XiaoLiu"
> person.name
< "XiaoLiu"

使用一个不存在的对象属性,不会报错 --> undefined

person.haha
undefined

动态的删减属性, 通过delete删除对象的属性

delete person.name
true
person
{age: 21, email: '6310@qq.com', score: 69}

动态的添加, 直接给属性添加新的值就行

person.address = "China"
'China'
person
{age: 21, email: '6310@qq.com', score: 69, address: 'China'}

判断属性值是否在这个对象中

'age' in person
"age" in person
true

'toString' in person
"toString" in person
true

判断一个属性是否是这个对象自身拥有的 --> hasOwnProperty()

person.hasOwnProperty('toString')
false
person.hasOwnProperty('age')
true
person.hasOwnProperty("age")
true

流程控制

forEach 循环

var age = [1,2,3,4,5,6,7,8,9,13,14,51,43];

//函数
age.forEach(function (value){
    console.log(value)
})

for...in --> 打印值的下标

//for(var index in object){}
var age = [12, 134, 13, 43, 56, 78, 912];
for (var num in age) {
    if (age.hasOwnProperty(num)) {
        alert("2333");
        console.log("存在");
        console.log(age[num]);
    }
}

for...of --> 打印值元素本身

var array = [3,4,5];
for(var element of array){
    console,log(element);
}

Map 和 Set

var map = new Map([["tom",88],["jeery",77],["frank",66]]);
var name = map.get("tom");  //通过key获得value
map.set("administrator",631062);  //新增 or 修改
map.delete("tom");  //删除
var set = new Set([1,1,11,22,33,33,44,55,66,77,77,99]);
set.add(11);
set.delete(1);
console.log(set.has(99)); //是否包含某个元素

iterator

遍历数组

var array = [3,4,5];
for(var element of array){
    console,log(element);
}

遍历map

var map = new Map([["tom",88],["jerry",77],["frank",66]]);
for (let element of map) {
    console.log(element);
}

(2) ['tom', 88]
(2) ['jerry', 77]
(2) ['frank', 66]

遍历set

var set = new Set([1,11,22,33,44,55,55,66,66,66,3,4,1,2,3])
for (let element of set){
    console.log(element);
}

函数

定义函数

定义方式一: 后端人员偏用

function abs(x){
    if(x >= 0){
        return x;
    }else {
        return -x;
    }
}

一旦执行到return 代表函数结束, 返回结果!

如果没有执行ruturn, 函数执行完也会返回结果, 结果就是 undefined

定义方式二: 前端人员偏用

var abs = function(x){
      if(x >= 0){
        return x;
    }else {
        return -x;
    }
}

function(x){...} 这是一个匿名函数. 但是可以把结果赋值给abs, 通过abs就可以调用函数

参数问题: JavaScript可以传递任意个参数, 也可以不传递参数

参数进来是否存在的问题?

假设不存在参数, 如何规避?

var abs = function(x){
    //手动抛出异常
    if(typeof x !== "number"){
        throw "Not a Number";
    }
    if(x >= 0){
        return x;
    }else {
        return -x;
    }
}

arguments

arguments 是一个JS免费赠送的关键字

代表 传递进来的所有参数, 是一个数组

function abs(x) {
    console.log("x=> " + x);

    for (var i = 0; i < arguments.length; i++){
        console.log(arguments[i]);
    }

    if (x >= 0){
        return x;
    }else {
        return -x;
    }
}

问题: arguments 包含所有的参数, 我们有时候想使用多余的参数来进行附加操作. 需要排除已有的参数

rest

以前:

function aaa(a,b,c) {
    console.log("a=> " + a);
    if (arguments.length > 2){
        for (var i = 2; i < arguments.length; i++){
            console.log(b);
            console.log(c);
            //...
        }
    }
}

ES6 引入的新特性, 获取除了已经定义的参数之外的所有参数

function aaa(a,b,...rest){
    console.log(a);
    console.log(b);
    console.log(rest);
}

rest 参数只能写在最后面, 必须用 ...标识

变量的作用域

在JavaScript中, var 定义的变量实际上是有作用域的

假设在函数体中声明, 则在函数体外不可使用 想要实现使用 --> 闭包

function demo01() {
    var x = 1;
    x = x + 1;
}

x = x + 2;  //Uncaught ReferenceError: x is not defined

如果两个函数使用了相同的变量名, 只要在函数内部, 就不冲突

function demo01() {
    var x = 1;
    x = x + 1;
}

function demo02(){
    var x = "A";
    x = x + 1;
}

内部函数可以访问外部函数的成员, 反之不行

function demo03(){
    var x = 1;

    //内部函数可以访问外部函数的成员, 反之不行
    function demo04(){
        var y = x + 1;
    }
    var z = y + 1;  //Uncaught ReferenceError: y is not defined
}

假设内部函数的变量与外部函数的变量重名

function demo04() {
    var x = 1;
    function demo05() {
        var x = 'A';
        console.log('内=> ' + x);
    }
    console.log('外=> ' + x);
    demo05();
}

在JavaScript中 函数查找变量从自身函数开始查找, 有 '内' 向 '外' 查找.

假设外部存在这个同名的函数变量, 则内部函数回屏蔽外部函数的变量

提升变量的作用域

function demo06(){
    var x = 'x' + y;
    console.log(x);
    var y = y;
}

执行结果 --> x undefined

说明 --> JavaScript执行引擎, 自动提升了y的说明, 但是不会提升变量y的赋值

等价于 -->

function demo07(){
    // var x,y,z;
    var y,x;
    x = 'x' + y;
    console.log(x);
    y = 'y';
}

这个是在JavaScript成立之初就存在的特性. 平时要养成规范. 所有的变量定义都放在代码头部, 不要乱放, 便于代码维护

function demo08(){
    var x =1,
        y = x + 1,
        z,i,a;

    // 之后可以随意使用
    z = x + 1;
    i = z + 1;
    a = i + 1;
    console.log(a);
}

全款i变量

// 全局变量
var x = 1;
function demo09(){
    console.log(x);
}
demo09();
console.log(x);

对象window

// 全局对象window
var x = '小刘学正在努力学Java';
alert(x);
alert(window.x);    // 默认所有的全局变量, 都会自动绑定在window对象下

// 等价于  -->
window.alert(x);
window.alert(window.x);  // 这里的window 就是浏览器

alter() 这个函数本身也是一个 window 变量

var x = '小刘正在努力学习JavaScript',
    old_alert;

window.alert(x);
old_alert = window.alert;
// old_alert(x);  等价于 --> window.alert(x)  这样就可以在浏览器上弹出x

window.alert = function () {
    
};
window.alert('小刘已经学完了JavaScript基础部分');  // 发现alert() 失效了

//恢复
window.alert = old_alert;
window.alert('小刘开始学习mysql部分');

JavaScript实际上只有一个全局变量, 任何变量(函数也可以视为变量), 假设没有在函数作用范围内找到, 就会向外查找, 如果在全局作用域都没有找到, 报错 referenceError

规范 -->

由于我们所有的全局变量都会绑定到我们的window上. 如果不同的js文件, 使用了相同的全局变量, 冲突 --> 如何能够减少冲突?

// 唯一全局变量
var KuangApp = {};

// 定义全局变量
KuangApp.name = 'kuangshen';
KuangApp.studentName = '小刘';

KuangApp.add = function (a,b) {
    return a + b;
}

把自己的代码全部放入自己定义的 唯一空间名字中. 降低全局匿名的问题

jQuery库

局部作用域 let

function demo11() {
    for (var i = 0; i < 100; i++) {
        console.log(i);
    }
    console.log(i + 1);	// 问题?  i 出了这个作用域还可以使用
}

demo11();

ES6 let关键字, 结局了局部作用域冲突的问题

function demo11() {
    for (var i = 0; i < 100; i++) {
        console.log(i);
    }
    console.log(i + 1); // 问题?  i 出了这个作用域还可以使用
}

demo11();

function demo12() {
    for (let i = 0; i < 100; i++) {
        console.log(i);
    }
    console.log(i + 1); // Uncaught ReferenceError: i is not defined
}

demo12();

建议大家使用let 去定义局部作用域的变量

常量 --> const

在ES6之前, 怎么定义常量 --> 只有用全部大写字母命名的变量都是常量: 建议不要修改这样的值

//常量  --> 之前定义:
var PI = '3.14';
console.log(PI);
PI = '123'; //可以改变这个值
console.log(PI);

在ES6 引入了关键字 const

//ES6 引入了关键字 const
const PI = '3.14';  //只读变量
console.log(PI);

PI = '123';  // readonly  -->  Uncaught TypeError: Assignment to constant variable
console.log(PI);

方法

定义方法 -->

方法就是把函数放在对象的里面, 对象只有两个东西: 属性和方法

var XiaoLiu = {
    name: '小刘',
    birthday: 2003,

    // 方法
    age: function (){
        // 年龄 = 今年 - 出生年
        var nowAge = new Date().getFullYear();
        return nowAge - this.birthday;
    }
}

//属性
XiaoLiu.name
//方法, 一定要带()
XiaoLiu.age()

将上面的代码拆开 -->

function getAge() {
    // 年龄 = 今年 - 出生年
    var nowYear = new Date().getFullYear();
    return nowYear - this.birthday;
}

var XiaoLiu = {
    name: '小刘',
    birthday: 2003,
    age: getAge
}

getAge.apply(XiaoLiu,[]); // this, 指向了 XiaoLiu, 参数为空

//XiaoLiu.age()  ok
//getAge()  在没有严格定义strict的情况下, NaN

this是无法指向的, 是默认指向调用它的那个对象

apply

在JavaScript中可以控制this的指向

function getAge() {
    // 年龄 = 今年 - 出生年
    var nowYear = new Date().getFullYear();
    return nowYear - this.birthday;
}

var XiaoLiu = {
    name: '小刘',
    birthday: 2003,
    age: getAge
}

var XiaoMing = {
    name: '小明',
    birthday: 2000,
    age: getAge
}

getAge.apply(XiaoMing,[]); // this, 指向了 XiaoMing, 参数为空

posted @ 2025-02-26 17:00  LYQ学Java  阅读(12)  评论(0)    收藏  举报