前端(十一):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位
    
目录
相关文章
|
8天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
8天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
13 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
13天前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
19 1
|
14天前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
14 1
|
24天前
|
前端开发 JavaScript 安全
JavaScript前端开发技术
JavaScript(简称JS)是一种广泛使用的脚本语言,特别在前端开发领域,它几乎成为了网页开发的标配。从简单的表单验证到复杂的单页应用(SPA),JavaScript都扮演着不可或缺的角色。
19 3
|
23天前
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
17天前
|
前端开发 JavaScript UED
"前端小技巧大揭秘:JS如何将后台时间戳秒变亲切小时前、分钟前,让用户秒懂,提升互动体验!"
【10月更文挑战第23天】在Web开发中,将后台返回的时间戳转换为“小时前”、“分钟前”、“刚刚”等友好的时间描述是常见需求。本文介绍如何用JavaScript实现这一功能,通过计算当前时间和时间戳的差值,返回相应的描述,提升用户体验。
22 0
|
28天前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
129 0
|
28天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
118 2
|
28天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
36 0