前端(十一):js基础知识语法

简介: js基础知识语法

浏览器组成

  • shell部分
  • 内核部分
    • 渲染引擎(语法规则和渲染)
    • js引擎
    • 其他模块

解释型语言 & 编译型语言

  • 编译型语言:c c++
    • 优点:快
    • 不足:移植性不好(不跨平台)
  • 解释型语言:python php js
    • 优点:跨平台
    • 不足:相对慢
  • java:
    • .java --> javac --> 编译 --> .class --> jvm --> 解释执行

单线程

  • js单线程 (同一时间只能干一件事)
  • 异步:同时进行
  • 同步:不同时进行

浏览器内核

浏览器 内核
Chrome webkit / blink
IE trident
Safari webkit
Firefox Gecko
Opera presto

数据类型

  • 原始值:Number String Boolean undefined null
  • 引用值:Array Object Function
  • 原始值变量类型及他们的值存储在栈中 (相当于拷贝变量,在栈中多个变量各存各的值,改变后,互不影响)
  • 引用值是把引用变量的名称存储在栈中,把其实际对象存在堆中 (相当于在栈中多个变量存了同一个堆的地址,改变后,最终访问的还是同一地址)
    console.log(undefined + undefined); // NaN number类型
    console.log(null === null); // true
    console.log(null + 123); // 123
    console.log(Array()); // []
    console.log(Object()); // {}
    console.log(Function()); // function anonymous(){} 匿名函数
    console.log(anonymous) // anonymous is not defined
    var a = 1;
    console.log(Function(a)); // function anonymous(){ 1 }
    function b(){
         }
    console.log(b); // function b(){}
    (function c(){
         })
    console.log(c); // c is not defined
    

立即执行函数

只有表达式才能被执行符号执行

  • (function () {} ());
  • (function () {} )();
  • !function () {} (); // !将其转换成了表达式
  • ~function () {} (); // ~将其转换成了表达式
  • -function () {} (); // -将其转换成了表达式
  • +function () {} (); // +将其转换成了表达式
    var a = ~function () {
           }
    console.log(a); // -1
    var a = ~function () {
           return 1 }
    console.log(a); // -1
    var a = ~function () {
           return 1 }()
    console.log(a); // -2
    

堆栈

原始值变量类型及他们的值存储在栈中 (相当于拷贝变量,在栈中多个变量各存各的值,改变后,互不影响)

引用值是把引用变量的名称存储在栈中,把其实际对象存在堆中 (相当于在栈中多个变量存了同一个堆的地址,改变后,最终访问的还是同一地址)

var arr = [1,2];
var arr1 = arr;
arr.push(3); // push 操作的是原地址(相当于不改变地址路径,改变地址内(地址指向的堆中)的内容)
console.log(arr,arr1); // [ 1, 2, 3 ] [ 1, 2, 3 ]
var arr = [1,2];
var arr1 = arr;
arr = [1,2,3]; // 等于号操作的是新地址(相当于改变栈中地址的指向,指向一个新地址)
console.log(arr,arr1); // [ 1, 2, 3 ] [ 1, 2 ]
var a = 1, b = 3;
b %= a + 2; // b = b % (a + 2)   b = 3 % (1 + 2)   b = 0
console.log(a++); // 1
console.log(a); // 2
console.log(--b); // -1

&& 和 ||

  • && : 返回第一个为假的表达式,否则返回最后一个表达式
  • || : 返回第一个为真的表达式,否则返回最后一个表达式
    console.log(1 && false && 0); // false
    console.log(0 || 2 || false); // 2
    console.log(1 && false && 0 || 2 || false); // 2
    function funA(e){
         
      // event = 非IE浏览器 || IE浏览器
      var event = e || window.event;
    }
    

练习题

  • 2的n次幂
    function numA(n) {
         
      var num = 2;
      for (var i = 1; i < n; i++) {
         
          num *= 2
      }
      return n === 0 ? 1 : num
    }
    console.log(numA(10)); // 1024
    
  • n的阶乘
    function numB(n){
         
      return n >= 1 ? n * numB(n-1) : 1;
    }
    console.log(numB(3));
    
  • 1 1 2 3 5 8 规律数字
    function numC(n){
         
      return n == 1 || n == 2 ? 1 : numC(n-2) + numC(n-1)
    }
    console.log(numC(7)); // 13
    
  • 输入123 输出321
    function numD(num) {
         
      return Number(String(num).split('').reverse().join(''))
    }
    console.log(numD(123), typeof nnumD(123)); // 13 number
    
  • 打印n以内的质数 (能从1到他本身只有两个数被他整除的数(相当于只剩下1和他本身了))
    function numE(n) {
         
      var arr = [];
      for (var i = 2; i < n; i++) {
         
          for (var j = 2; j < i; j++) {
         
              if (i % j === 0) {
         
                  // 跳出循环,在判断是不是他本身,如果不是,证明不是质数,如果是本身,证明已经除到循环结束了,证明他是质数
                  break; 
              }
          }
          if (i === j) {
          // 判断是不是他本身,如果不是,证明不是质数
              arr.push(i)
          }
      }
      return arr;
    }
    console.log(numE(100));
    

typeof

console.log(typeof(typeof(a))); // string
console.log(typeof 1); // number
console.log(typeof NaN); // number
console.log(typeof Infinity); // number
console.log(typeof 'Lee'); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(null == null); // true
console.log(null == undefined); // true
console.log(typeof []); // object
console.log(typeof {
   }); // object
console.log(typeof function (){
   }); // function
console.log([] instanceof Array); // true
console.log([].__proto__ === Array.prototype); // true
console.log([].constructor === Array); // true
console.log(Array.isArray([])); // true
console.log(Object.prototype.toString.call([])); // [object Array]
console.log({
   } instanceof Object); // true
console.log({
   }.__proto__ === Object.prototype); // true
console.log({
   }.constructor === Object); // true
console.log(Object.prototype.toString.call({
   })); // [object Object]

显示类型转换(NumberparseIntparseFloattoStringStringBoolean

// Number
console.log(Number('abc')); // NaN
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
// parseInt
console.log("parseInt('abc')", parseInt('abc')); // NaN
console.log("parseInt(456.789)", parseInt(456.789)); // 456
console.log("parseInt('456.789abc')", parseInt('456.789abc')); // 456
console.log("parseInt(true)", parseInt(true)); // NaN
console.log("parseInt(num,进制)", parseInt(101000, 2)); // 40 从前往后将2进制的101000转换成十进制的数
console.log("parseInt(num,进制)", parseInt(123456789, 2)); // 1 从前往后将2进制的1转换成十进制的数
console.log("parseInt(num,进制)", parseInt(213456789, 2)); // NaN
// parseFloat
console.log("parseFloat('123.456.789abc')", parseFloat('123.456.789abc')); // 123.456
// toString 将数字转换成目标进制
console.log("undefined.toString()", undefined.toString()); // Cannot read property 'toString' of undefined
console.log("null.toString()", null.toString()); // Cannot read property 'toString' of null
// 将二进制101000转换成16进制
console.log("parseInt(101000, 2).toString(16)", parseInt(101000, 2).toString(16)) // 28

隐式类型转换 (isNaN运算符或且非)

// isNaN(a) ==> isNaN(Number(a))
console.log("isNaN('abc')", isNaN('abc')); // true
// ++ -- ==>> a++ Number(a)++
console.log("undefined == null", undefined == null); // true

不发生类型转换 (=== !==

console.log(undefined === null); // false

函数

  • 函数实参和
    // 函数实参和
    function sum(){
         
      console.log("sum -> arguments", arguments instanceof Object); // true
      console.log("sum -> arguments", arguments)
      var res = 0;
      for (const key in arguments) {
         
          if (arguments.hasOwnProperty(key)) {
         
              res += arguments[key];
          }
      }
      return res;
    }
    console.log("sum(1,2,3,4)", sum(1,2,3,4)); // 10
    
  • 形式参数:function aaa(a,b,c){} 实际参数:aaa(1,2,3)
    function funA(a){
          // arguments和a映射规则,你变我也变
      a = 3;
      console.log("funA -> arguments[0]", arguments[0]) // 3
      arguments[0] = 4;
      console.log("funA -> a", a) // 4
    }
    funA(1);
    function funB(a,b){
         
      // 实参未传值,实参arguments变化,形参不随之变化
      arguments[1] = 3;
      console.log("funB -> b", b) // undefined
      // 实参未传值,形参变化,实参arguments不随之变化
      b = 4;
      console.log("funB -> arguments[1]", arguments[1]) // 3
    }
    funB(1);
    
  • js精度不准
    0.14 * 100 
    // 可正常计算的范围为小数点前16位和后16位
    
目录
相关文章
|
28天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
25天前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
28天前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
41 5
|
26天前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
63 1
|
1月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
35 4
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
112 1
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
40 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
1月前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
47 1
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
178 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
48 0
下一篇
DataWorks