JavaScript入门

JavaScript 属于脚本语言,通常在浏览器上解释执行。 通常用于可视化和交互软件。

JavaScript是一种“动态类型语言”,这意味着不同于其他一些语言(如C、JAVA), 您不需要指定变量将包含什么数据类型.

变量(Variable)

变量 是存储数据的容器。要声明一个变量,先输入关键字 let 或 var,然后输入合适的名称

let myVariable;
var avar;

var的作用域被规定为一个函数作用域,而let则被规定为块作用域,块作用域要比函数作用域小一些, 但是如果两者既没在函数中,也没在块作用域中定义,那么两者都属于全局作用域。

变量存储值的类型有字符串、数字、布尔值、数组及对象。

  • String 字符串(一串文本):字符串的值必须用引号(单双均可,必须成对)扩起来。例如

    let myVariable = 'hello';
    
  • Number 数字:无需引号。

    let myVariable = 10;
    
  • Boolean 布尔值(真/假): true/false 是 JavaScript 里的特殊关键字,无需引号。 例如

    let myVariable = true;
    
  • undefined 未定义的,例如变量声明了但未赋值。

    let myVariable;
    
  • null 特指对象的值未设置。在布尔运算中被认为是false。

  • Array 数组:用于在单一引用中存储多个值的结构。

    let myVar = [1, 'hello', 'world', 10];
    

数组元素引用方法: myVariable[0], myVariable[1]

  • Object 对象:JavaScript 里一切皆对象,一切皆可储存在变量里。

    let myVariable = document.querySelector(‘h1’);

现在推荐都使用let来声明变量, 因为它限制较为严格,对于重复定义变量,会立即出错。

查看变量类型 typeof myVariable

变量也可以隐式声明,例如直接赋值

a = 10

常量

通过 const 定义的变量与 let 变量类似,但不能重新赋值, 可以称为常量。

基本代码规范

  • 赋值符号两边留一个空格

  • 每行结束添加一个分号

    let aa = 1;

运算符

  • 等于, ===, 测试两个值是否相等,并返回一个 true/false (布尔)值。

  • 不等于 “!==”, 和等于运算符相反,测试两个值是否不相等,并返回一个 true/false (布尔)值。

在代码中使用==和!=来判断相等和不相等,也是JavaScript中的有效运算符,但它们与===/!==不同, 前者测试值是否相同, 但是数据类型可能不同,而后者的严格版本测试值和数据类型是否相同。

例如 ::
var a=”123”

var b=123 c = (a==b) d = (a===b)

  • instanceof 是否是对象的实例。

逻辑运算符

逻辑运算符共有三个, 分别为”&&”、”||”和 “!”。

  • “&&”, 逻辑与, 如果第一个为真,则表达式值为第二个参数, 否则为第一个参数值。

  • “||”, 逻辑或, 如果第一个为假,则表达式值为第一个参数,否则为第二个参数值。

  • “!”, 逻辑非, 取反。

示例代码

let a = 3 && 4
let b = 0 || 3
let c = !b

类型转换

  • Number函数, 类型转换为数字。

字符串

可以选择单引号或双引号来包裹字符串。

Number函数用来将字符串转换为数字类型

let myString = '12345';
let mm = Number(myString);
typeof mm;

另一方面,每个数字都有一个名为 toString() 的方法,它将把它转换成等价的字符串

let myNum = 12345;
let ss = myNum.toString();
typeof ss;

获得字符串的长度, 使用 length 属性. 输入以下的两行代码

let s1 = 'hello world';
s1.length;

取子字符串,使用slice方法,并传递上下索引

let s1 = 'hello world';
s1.slice(3);     //从3到结尾
    s1.slice(3,5);   //从3到5
    s1.slice(-3,-1); //-3-1
  • charAt() 访问字符串的指定位置

    let str = “Hello OpenWrt” str.charAt(6)

  • indexOf方法查询子字符串首次出现的位置, 返回-1, 表示没有此字符串。 可以指定查找的起始位置

    let str = “Hello Beijing” str.indexOf(“Bei”) str.indexOf(“Bei”, 7)

  • 替换子字符串, replace方法,并返回替换后的字符串。

  • split() 字符串分割,返回数组。传递一个分割字符sep。

  • search() 查找字符串的返回索引,找不见返回-1

数组

数组是一个包含了多个值的对象, 数组元素可以为任意类型,有一个length属性获取数组长度。

var arr = [1, 3, 5]; var arr2 = []; var arr3 = new Array(); var arr4 = new Array(1,2,3,4); var arr5 = new Array(10); //长度为10的空数组。 var arr6 = [1,2,3,,,10]; //数组长度6

arr[10] = “hello”; //长度为11, 前面填undefiled

数组相关方法:

  • push() 在末尾增加元素,增加一个或多个,并返回数组元素个数。

  • pop() 弹出最后一个元素并返回。

  • shift() 弹出第一个元素并返回。

  • unshift() 在数组最前面添加元素,并返回元素个数。

  • reverse() 原地逆转数组元素的顺序。

  • slice() 通过删除或替换现有元素或者原地添加新的元素来修改数组, 并以数组形式返回被修改的内容。此方法会改变原数组。

通常用于在中间添加元素

原型如下

 array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

- start 起始位置, 可以取负值,表示length+start位置,例如-1表示倒数最后一个位置。
- deleteCount 删除的个数。
- item1 ... 添加的部分。
  • sort() 数组进行排序,默认正序。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码 单元值序列时构建的 可以有一个参数是比较函数。

    arr = [1, 10, 20, 5, 9, 0] function compareFn(a, b){

    if(a>b) return 1;

    if(a==b) return 0; return -1;

    } arr.sort(compareFn);

  • toString() 方法, 不需要参数,转化为字符串。

  • concat() 连接两个数组,并返回。不改变原有数组。

  • slice() 截取指定范围数组并返回,不改变原数组。 begin,表示开始位置,end表示结束位置。

    arr.slice([begin[, end]])

  • join() 数组转化为字符串,需要一个参数

    let myNewString = myArray.join(',');
    

数组去重

利用哈希

循环

  • while循环

  • do while循环

  • for循环

  • for in循环,通常用于遍历数组中的所有数组元素,或者遍历对象的所有属性。

for 变量  in 对象 {
   执行语句块
}

遍历为数组的下标。

函数

函数定义以function开头,函数参数类型不需要定义,没有返回值定义。示例如下

function multiply(num1, num2) {
  let result = num1 * num2;
  return result;
}

匿名函数,通常赋值给一个变量

var f = function (参数列表){
    }
::

var f = new Function (参数列表)( 函数执行体 )

函数调用

  • 直接调用,函数默认都为windows对象下。采用window.fn(…)形式或fn(…)调用。

  • 以call方式调用,形如: fn.call(window,…)调用,形参从第二个开始,

  • 以apply方法调用,形如: fn.apply(window,[…])调用, 参数为一个数组。

如果方法想连续调用,那方法返回this。

return this;

call

apply

立即执行函数

预编译

js会进行预编译, 系统会把函数声明提升到逻辑的最前面。即函数定义可以放在函数调用的代码块下面。

    hello()
function hello(){
       console.log("hello world")
    }

事件

事件能为网页添加真实的交互能力。它可以捕捉浏览器操作并运行一些代码做为响应。 最简单的事件是 点击事件,鼠标的点击操作会触发该事件。 可尝试将下面的代码输入到控制台, 然后点击页面的任意位置

document.querySelector('html').onclick = function() {
        alert('别戳我,我怕疼。');
}

将事件与元素绑定有许多方法。在这里选用了 <html> 元素,把一个匿名函数(就是没有命名的函数, 这里的匿名函数包含单击鼠标时要运行的代码)赋值给了 html 的 onclick 属性。

包装类

var a = new Number(123); var str = new String(“hello”);

var num = 10; num.len = 20; console.log(num.len);

var str = “abcd” str.length = 2 console.log(str)

Date对象

获取时间

d = new Data()

getDate() //返回一个月的某一天,(1-31)
    getMonth() //返回月份 (0-11), 实际情况要加一。
    getFullYear() // 返回4位的年份
    getDay()      // 返回星期几, 0表示星期日,1表示星期一,依次类推。

构造一个日期:

setDate()      //设置天
setFullYear()  //设置年
setMonth()    //设置月

Math对象

  • abs(x) 返回绝对值

  • floor(x) 对数进行下舍入

  • round(x) 四舍五入到最近的整数。

  • round() 返回随机数 (0-1)

DOM表单

表单,form标签

  • action 返回该表单的提交地址

  • reset() 重置表单

  • submit() 提交表单。

JSON

var obj = JSON.parse(str); //由JSON字符串转换为JSON对象

var str1 = JSON.stringify(obj); //由obj转换为字符串。

客户端存储

新流派:Web Storage 和 IndexedDB

现代浏览器有比使用 cookies 更简单、更有效的存储客户端数据的 API。

Web Storage API 提供了一种非常简单的语法,用于存储和检索较小的、由名称和相应值组成的数据项。 当您只需要存储一些简单的数据时,比如用户的名字,用户是否登录,屏幕背景使用了什么颜色等等, 这是非常有用的。

IndexedDB API 为浏览器提供了一个完整的数据库系统来存储复杂的数据。这可以用于存储从完整的 用户记录到甚至是复杂的数据类型,如音频或视频文件。

Storage.setItem() 方法允许您在存储中保存一个数据项——它接受两个参数:数据项的名字及其值。试着把它输入到你的JavaScript控制台(如果你愿意的话,可以把它的值改为你自己的名字!)

localStorage.setItem(‘name’,’Chris’); Storage.getItem() 方法接受一个参数——你想要检索的数据项的名称——并返回数据项的值。 现在将这些代码输入到你的JavaScript控制台:

var myName = localStorage.getItem(‘name’); myName 在输入第二行时,您应该会看到 myName变量现在包含name数据项的值。

Storage.removeItem() 方法接受一个参数——你想要删除的数据项的名称——并从 web storage 中 删除该数据项。在您的JavaScript控制台中输入以下几行:

localStorage.removeItem(‘name’); var myName = localStorage.getItem(‘name’);

为每个域名分离储存 每个域都有一个单独的数据存储区(每个单独的网址都在浏览器中加载). 你会看到, 如果你加载两个网站(例如google.com和amazon.com)并尝试将某个项目存储在一个网站上, 该数据项将无法从另一个网站获取。

存储复杂数据 — IndexedDB

get

post

echart

百度前端框架。

JS面试题

1, var和let的区别 2, 匿名函数? 3, 变量类型有几种, 变量的作用域? 4, 闭包

常见问题

1,出现from origin ‘null’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource

答: 这是响应头解决跨域请求问题,通常浏览器不允许跨域请求。

解决方法: 如果是go语言,在服务端将HTTP相应头上加上以下信息

resp.Header().Set("Access-Control-Allow-Origin", "*")