深入javascript计划二:数据类型检测与数据类型抽象转换

从恶意样本到Sigma规则:构建可移植的威胁检测逻辑 在网络安全领域,威胁检测是防御体系的核心环节。其基本原理是通过分析系统日志、网络流量等数据源中的异常模式,识别潜在的恶意活动。传统的检测方法往往依赖于特定平台(如Splunk、Elasticsearch)的定制化查询,导致检测逻辑难以在不同技术栈间共享和复用,形成了知识孤岛。Sigma规则的出现解决了这一痛点,它作为一种与具体SIEM平台无关的通用检测规则语言,使用YAML格式描述检测逻辑,并通过专用工具链编译成不同平台的本地查询。这种标准化方法极大地提升了检测能力的可移植性和社区共享效率,其技术价值在于将 阅读详情

上篇刚刚介绍完Javascript数据类型,这篇就写写数据类型检测跟数据类型转换。

在Javascript中多数都是使用typeof来判断数据类型,typeof是否能正确判断数据类型?

1.typeof判断数据类型

let a = "a"
console.log(typeof a) // string
a = 1
console.log(typeof a) // number
a = false
console.log(typeof a) // boolean
a = Symbol()
console.log(typeof a) // symbol
a = undefined
console.log(typeof a) // undefined

a = null
console.log(typeof a) // object

a = []
console.log(typeof a) // object
a = {}
console.log(typeof a) // object
a = function () {}
// a = console.log
console.log(typeof a) // function

null不是对象,答案在Javascript数据类型文章中有讲解

基础数据类型除了null,都显示正确的类型

但是引用数据类型,除了函数之外,都会显示object

因此用typeof判断就不太合适,采用instanceof会更好,instanceof的原理是基于原型链的查询,只要处于原型链中,判断永远为true

2.instanceof判断数据类型

let o = {}
console.log(o instanceof Object) // true
console.log(o instanceof Array) // false

let a = []
console.log(a instanceof Array) // true
console.log(a instanceof Object) // 这是因为 Array 是 object 的子类 所以也是符合true
console.log(a instanceof String) // false

let b = function () {}
console.log(b instanceof Function) // true
console.log(b instanceof Object) // 这是因为 Function 是 object 的子类 所以也是符合true
console.log(b instanceof Array) // false

如果想让instanceof判断基础类型咋弄?

Stmbol.hasInstance 用于判断某对象是否为某构造器的实例。因此你可以用它自定义instanceof行为!

class MyArray {  
    static [Symbol.hasInstance](instance) {
      return Array.isArray(instance);
    }
}
let a = []
let aa = {}
console.log(a instanceof MyArray) // true
console.log(aa instanceof MyArray) // false


class MyNumber {
    static [Symbol.hasInstance](instance) {
        return typeof instance === 'number';
    }
}
let b = 123
let bb = 'b'
console.log(b instanceof MyNumber) // true
console.log(bb instanceof MyNumber) // false

能不能手动实现一下instanceof的功能?

核心思路:原型链的向上查找

function myInstanceof(left, right) {
    // 基本数据类型直接返回false
    if(typeof left !== 'object' || left === null) return false
    // getProtypeOf是Object对象自带的一个方法,能够拿到参数的原型对象
    let proto = Object.getPrototypeOf(left)
    while(true) {
        // 查找到尽头,还没找到
        if(proto == null) return false
        // 找到相同的原型对象
        if(proto == right.prototype) return true
        proto = Object.getPrototypeof(proto)
    }
}
console.log(myInstanceof("111", String)) // false
console.log(myInstanceof(new String("111"), String)) // true

3.==、===、Object.is()讲解

Object.is在===严格相等的基础上修复了一些特殊情况下的失误,具体来说就是+0和-0,NaN和NaN。

function is(x, y) {
  if (x === y) {
    //运行到1/x === 1/y的时候x和y都为0,但是1/+0 = +Infinity, 1/-0 = -Infinity, 是不一样的
    return x !== 0 || y !== 0 || 1 / x === 1 / y;
  } else {
    //NaN===NaN是false,这是不对的,我们在这里做一个拦截,x !== x,那么一定是 NaN, y 同理
    //两个都是NaN的时候返回true
    return x !== x && y !== y;
  }
}

宽松相等(loose equals)== 和严格相等(strict equals)=== 都用来判断两个值是否 "相等",但是它们之间有一个很重要的区别,特别是在判断条件上。

常见的误区是"==检查值是否相等,===检查值和类型是否相等"。听起来蛮有道理,然而还不够准确。

正确的解释是"==允许在相等比较中进行强类型转换,而===不允许"。

这时候要先讲一些类型转换!

强制类型转换和类型转换

类型转换(type casting)这是显式的操作,强制类型转换(coercion)这是隐式操作。

类型转换发生在静态类型语言的编译阶段,强制类型转换发生在动态类型语言运行时。

然而javascript中通常将它们都称为强制类型转换,建议用"隐式强制类型转换(implicit coercion)"和"显式强制类型转换(explicit coercion)"来区分。

let a = 42
let b = a + "" // 隐式强制类型转换
let c = String(a) // 显式强制类型转换

抽象值操作

字符串、数字和布尔值之间类型转换的基本规则。ES5规范第9节中定义了一些"抽象操作"(即"仅供内部使用的操作")和转换规则。如:ToString、ToNumber、ToBoolean、ToPrimitive

ToString

它主要负责处理非字符串到字符串的强制类型转换。

基本类型的字符串化规则为:

  1. null 转换为 "null"
  2. undefined 转换为 "undefined "
  3. true 转换为 "true"
  4. 数字的字符串化遵循通用规则,对于极小和极大的数使用指数形式
  5. 普通对象,除非自定义,否则toString()(object.protoptye.toString())返回内部属性[[ class ]]]的值,如:"[object object]"

极小和极大的数使用指数形式:

let a1 = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 + ""
console.log(a1, typeof a1) // 1.07e+21 string


let aa2 = 0.000000000000000000000000000000007 + ""
console.log(aa2, typeof aa2) // 7e-33 string

普通对象:

let a = {} + ""
console.log(a) // [object Object]

let b = { // 自定义toString
    toString: () => {
        return "111111"
    }
} + ""
console.log(b) // 111111

JSON 字符串化

JSON应该是我们在 JS 中最常用的序列化和反序列化工具之一了。JSON.stringify()在将对象序列化为字符串的时候也用到了 ToString。但是需要注意,JSON 字符串化并非严格意义上的强制类型转换。

对于大多数基本类型值来说,JSON 字符串化的结果和toString()是差不多的,只不过序列化的结果总是字符串

JSON.stringify(1) // "1"
JSON.stringify('1') // ""1"" (带有双引号的字符串)
JSON.stringify(null) // "null"
JSON.stringify(true) // "true"

 有些值JSON是无法处理的,例如:undefined、function、symbol和包含循环引用(对象之间相互引用)的对象。我们把这些它们称作不安全的JSON值。

相对

所有安全的JSON值都是可以用JSON.stringif()字符串化。

JSON.stringify()在对象中遇到undefined、function、symbol的时候会自动忽略他们,在数组中这回返回 null(为的是保证数据的下标不变),在遇到循环引用的对象时会报错。例如

JSON.stringify(undefined) // undefined
JSON.stringify(function () {}) // undefined

JSON.stringfiy([1, undefined, function () {}, 4]) // "[1,null,null,4]"
JSON.stringify({ a: 1, b: function () {}, c: undefined }) // "{"a":1}"
JSON.stringify({
  toString: function () {
    return '1'
  },
}) // "{}"

let a = {}
let b = { a: a }
a.b = b
JSON.stringify(a) // Uncaught TypeError: Converting circular structure to JSON

如果对象中定义了toJSON()方法,JSON字符串化的时候会首先调用该方法,然后用它的返回值来进行序列化。如果你对某些非法 JSON 值定义了ToJSON()方法,并返回一个安全的 JSON 值,那么这个值就能被字符串化了。注意,对象是不自带toJSON()方法的,需要你主动定义它。如:

let a = {}
let b = { a: a }
a.b = b

b.toJSON = function () {
  return {}
}

JSON.stringify(a) // "{"b":{}}"

let foo = function () {}
foo.toJSON = function () {
  return 123
}
JSON.stringify(foo) // "123"

let bar = {
  a: undefined,
  toJSON: function () {
    return { a: null }
  },
}
JSON.stringify(bar) // "{"a":null}"

toJSON()返回的并不一定是JSON字符串化后的值(这样其实会对字符串再做一次字符串化),而应当是一个适当的值,可以是任何类型,然后再由JSON.stringify()对其字符串化。

总结:

JSON.stringify()并不是强制类型转换

1.字符串、数字、布尔值、null的JSON.stringify()规则与ToString基本相同。

2.如果传递给JSON.stringify()的对象中定义了toJSON()方法,那么该方法会在字符串化前调用,以便将对象转换为安全的JSON值。

ToNumber

它主要负责处理非数字到数字的强制类型转换。

将基本数据类型转换为数字的规则为:

  1. true 转换为 1
  2. false 转换为 0
  3. undefined 转换为 NaN
  4. null 转换了 0
  5. 对字符串的转换遵循通用规则,处理失败时返回NaN,对以 0 开头的十六进制数按十进制处理而非十六进制
  6. 对象(包括数组)会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其转换成数字

对象转换成基本类型值的规则为:

symbolToPrimitive抽象操作会检查该值是否有valueOf()方法

如果有并且返回基本类型值,就使用该值进行强制类型转换。

如果没有则使用toString()方法,判断toString()有没有返回值 有的话就进行强制类型转换。

如果valueOf()和toString()都不返回基本类型值,则会产生 TypeError 错误。

例子:

let a = {
  valueOf: function () {
    return '1'
  },
}
let b = {
  toString: function () {
    return '2'
  },
}
Number(a) // 1
Number(b) // 2

let c = [1, 2, 3]
Number(c) // NaN
c.valueOf = function () {
  return 1
}
Number(c) // 1

let d = []
Number(d) // 0
d.toString = function () {
  return 1
}
Number(d) // 1

let e = [1, 2, 3]
e.toString = function () {
  return this.join('') // 123
}
Number(e) //123

 ToBoolean

Javascript中有两个关键词true和false,分别代表布尔值类型中的真、假。我们常误认为数值1和0分别等同于true和false。在有些语言中可能是这样,都是在Javascript中布尔值和数字是不一样的。虽然我们可以将1强制类型转换为true,将0转换为false,但是它们并不是一回事。

Javascript中的值可以分为以下两类:

1.可以被强制类型转换为false的值

2.可以被强制类型转换为true的值

以下这些是假值(false):

  • undefined
  • null
  • false
  • +0、-0和NaN
  • ""

除了假值表以外的所有值都可以理解为真值(true),一般来说,所有的对象都是真值,但是有一些特殊情况,我们可以把他们叫做假值对象。

例子:

var a = new Boolean(false)
var b = new Number(0)
var c = new String('')
var d = new Boolean(0)

var foo = Boolean(a && b && c && d)
foo // true

foo为true,说明a、b、c、d都为true。这些封装了假值的对象并非假值。那它究竟是什么?

虽然Javascript代码中出现了假值对象,但它实际上并不属于javascript语言的范畴。

它们是来自浏览器在某些特定条件下创造的对象,例如 document.all:

document.all // 返回一个 HTMLAllCollection 对象
!!document.all // false

这是一个类数组对象,由 DOM 提供(而非 JavaScript 引擎)提供给 JavaScript 程序使用。它以前曾是一个真正意义上的对象,布尔强制类型转换的结果为 true,但现在它是一个假值对象——并且这已经是一个被废止的方法了。

由于很多 JavaScript 程序依赖document.all来判断是否是旧版浏览器,因此一直没有把它去掉。

再说一说几个真值的情况——虽然刚才说过了假值表以外的都是真值,但是你还可能会遇到一些比较刁钻的状况:

let a = Boolean('false')
console.log(a) // true

let b = Boolean('0')
console.log(b) // true

let c = Boolean('""')
console.log(c) // true

 对于字符串来说,除了""以外都是真值。同时,对于[]、{}、function() {}这一类的对象都是真值。

ToPrimitive

它主要负责将值转换为原始值(基本数据类型)的强制类型转换,注意原始值不包括symbol

ToPrimitive(obj,preferredType)

JS引擎内部转换为原始值ToPrimitive(obj,preferredType)函数接受两个参数,第一个obj为被转换的对象,第二个
preferredType为希望转换成的类型(默认为空,接受的值为Number或String)

在执行ToPrimitive(obj,preferredType)时如果第二个参数为空并且obj为Date的事例时,此时preferredType会
被设置为String,其他情况下preferredType都会被设置为Number如果preferredType为Number,ToPrimitive执
行过程如
下:
1. 如果obj为原始值,直接返回;
2. 否则调用 obj.valueOf(),如果执行结果是原始值,返回之;
3. 否则调用 obj.toString(),如果执行结果是原始值,返回之;
4. 否则抛异常。

如果preferredType为String,将上面的第2步和第3步调换,即:
1. 如果obj为原始值,直接返回;
2. 否则调用 obj.toString(),如果执行结果是原始值,返回之;
3. 否则调用 obj.valueOf(),如果执行结果是原始值,返回之;
4. 否则抛异常。

首先我们要明白obj.valueOf()和obj.toString() 还有原始值分别是什么意思,这是弄懂上面描述的前提之一:

toString用来返回对象的字符串表示

let obj = {};
console.log(obj.toString());//[object Object]

let arr2 = [];
console.log(arr2.toString());//""空字符串

let date = new Date();
console.log(date.toString());//Sun Feb 28 2016 13:40:36 GMT+0800 (中国标准时间)

 valueOf方法返回对象的原始值(基本数据类型),可能是字符串、数字、布尔值等

let obj = {
  name: "obj"
};
console.log(obj.valueOf());//Object {name: "obj"}

let arr1 = [1];
console.log(arr1.valueOf());//[1]



let date = new Date();
console.log(date.valueOf());//1456638436303
如代码所示,三个不同的对象实例调用valueOf返回不同的数据

原始值(基本数据类型):null、undefined、string、boolean、number五种

弄清楚这些以后,举个简单的例子:

let a={};
ToPrimitive(a)


分析:a是对象类型但不是Date实例对象,所以preferredType默认是Number,先调用a.valueOf()不是原始值,继续来调
用a.toString()得到string字符串,此时为原始值,返回之.所以最后ToPrimitive(a)得到就是"[object Object]"

 

如果觉得描述还不好明白,一大堆描述晦涩又难懂,我们用代码说话:

const toPrimitive = (obj, preferredType='Number') => {
    let Utils = {
        typeOf: function(obj) {
            return Object.prototype.toString.call(obj).slice(8, -1);
        },
        isPrimitive: function(obj) {
            let types = ['Null', 'String', 'Boolean', 'Undefined', 'Number'];
            return types.indexOf(this.typeOf(obj)) !== -1;
        }
    };

    if (Utils.isPrimitive(obj)) {
        return obj;
    }

    preferredType = (preferredType === 'String' || Utils.typeOf(obj) === 'Date') ?
     'String' : 'Number';

    if (preferredType === 'Number') {
        if (Utils.isPrimitive(obj.valueOf())) {
            return obj.valueOf()
        };
        if (Utils.isPrimitive(obj.toString())) {
            return obj.toString()
        };
    } else {
        if (Utils.isPrimitive(obj.toString())) {
            return obj.toString()
        };
        if (Utils.isPrimitive(obj.valueOf())) {
            return obj.valueOf()
        };
    }
}

var a={};
ToPrimitive(a);//"[object Object]",与上面文字分析的一致

还有更细节的操作,我就不讲了,如果感兴趣的话可以看看《你不知道的 JavaScript 中卷》第一部分第四章,好了,我们回到原题讲解

这时候就会有人说那是不是==比===慢呀?

实际上虽然强制类型转行确实要花多点时间,但仅仅是微秒级(百万分之一秒)的差距而已。

1.字符串和数字之间的相等比较

let a = 42
let b = "42"
console.log(a == b) // true
console.log(a === b) // false

因为 a === b 没有强制类型转换,所以为false,42与"42"不相等。

而 a == b 是宽松相等,即如果两个值得类型不同,则对其中之一或者两者都进行强制类型转换。

具体怎么转换?是 a 从42转换为 字符串的 "42",还是b从"42"转成数字42?

ES5规范定义 11.9.3.4-5这样定义:

1.如果Type(x)是数字,Type(y)是字符串,则返回 x == ToNumber(y) 的结果。

2.如果Type(x)是字符串,Type(y)是数字,则返回ToNumber(x) == y的结果。

根据规范,b的值"42" 应该被强制类型转换为数字以便进行相等比较,所以例子中两个值相等,均为42。

2.其他类型和布尔类型之间的相等比较

let a = "42"
let b = true
console.log(a == b) // false
console.log(a === b) // false

ES5规范定义 11.9.3.6-7这样定义:

1.如果Type(x)是布尔类型,Type(y)是其他类型,则返回 ToNumber(x) == y的结果。

2.如果Type(y)是布尔类型,Type(y)是其他类型,则返回 x == ToNumber(y)的结果。

所以图上例子,Type(b)是布尔类型会将true转换成为1,变成 "42" == 1,然后两者数据类型不一致,所以"42"根据规则11.9.3.4-5(也就是字符串与数字比较规则)进行强制类型转换,所以"42"会变成42,最后变成 42 == 1,结果为false

3.null和undefined之间的相等比较

简单讲解一下 undefined和undeclared

undefined:是在作用域中声明了但是还没有赋值的变量

undeclared:是没有在作用域声明过的变量 如果直接写会报错如: x ReferenceError: b is not define

let test
console.log(test) // undefined
console.log(test2) // test2 is not defined

回到原题

let a = null
let b;
console.log(b) // undefined

console.log(a == b) // true
console.log(a == null) // true
console.log(b == null) // true

console.log(a == false) // false
console.log(b == false) // false
console.log(a == "") // false
console.log(b == "") // false
console.log(a == 0) // false
console.log(b == 0) // false

ES5规范定义 11.9.3.2-3这样定义:

1.如果Type(x)是null,Type(y)是undefined,则返回true。

2.如果Type(x)是undefined,Type(y)是null,则返回 true。

4.对象和非对象之间的相等比较

对象包括:对象、函数、数组

非对象包括:字符串、数字、布尔值(布尔值会先被强制类型转换为数字)

ES5规范定义 11.9.3.8-9这样定义:

1.如果Type(x)是字符串或数字,Type(y)是对象,则返回 x == ToPrimitive(y) 的结果。

2.如果Type(x)是对象,Type(y)是字符串或数字,则返回 ToPrimitive(x) == y 的结果。

let a = 42
let b = [42]

console.log(a == b) // true

[42]会先调用ToPrimitive抽象操作,返回"42",变成 "42" == 42 然后又变成 42 == 42,所以返回true

let a ="abc"
let c = Object(a)
console.log(c) // [String: 'abc']
console.log(c == a) // true
console.log(c === a) // false

c == a 返回true,因为c是通过ToPrimitive进行强制类型转换,并返回标量基本类型值"abc","abc" == "abc"所以返回true。

但是有些值不这样,因为==算法优先级规则。如:

let a = null
let b = Object(a)
console.log(a == b) // false


let c = undefined
var d = Object(c)
console.log(c == d) // false

let e = NaN
let f = Object(e)
console.log(e == f) // false

因为没有对应的封装对象,所以null和undefined不能够封装(boxed),Object(null)和Object()均返回一个常规对象,

NaN能够封装为数字对象,但是拆封之后NaN == NaN 返回false,因为NaN 不等于NaN。

NaN理解为"无效数值"、"失败数值"、"坏数值",因为NaN是一个特殊值,所以它和自身是不相等。

如何判断NaN相等?

let a = NaN
console.log(isNaN(a)) // true

就讲解到这里。

参考:

https://github.com/jawil/blog/issues/5

http://47.98.159.95/my_blog/js-base/002.html

《你不知道的javascript  中卷》

DeepSeek 2025 计划:AI 全面赋能前端开发流程 DeepSeek 2025 计划通过 AI 代码助手与设计助手,重新定义了前端开发的效率边界:从需求描述到可运行代码的瞬间生成,从静态界面到动态体验的智能优化,从框架依赖到跨域融合的范式转移。这场革命不仅提升了开发效率,更将前端开发者从重复性劳动中解放出来,专注于更具创造性的工作。对于开发者而言,这既是挑战(传统技能贬值加速),更是机遇(新职业赛道涌现)。唯有主动拥抱 AI 技术,提升自身的跨域能力,才能在这场变革中保持竞争力。未来的前端开发,将不再是单纯的代码编写,而是AI 工具与人类智慧的协同进化。 阅读详情

相关推荐

晶振(晶体振荡器)测试方法详解

晶振测试方法分为无源和有源两种类型。无源晶振(两脚)需用示波器测试波形,重点关注正弦波形状、200mV-1.5Vpp幅值和频率精度;有源晶振(四脚)通电后直接输出方波。测试要点包括:示波器使用10X探头、AC耦合,带宽需5倍于晶振频率;万用表可初筛短路/开路;替换法是工程最有效方法。常见故障排查顺序:供电→复位→焊接→型号→负载电容→波形观察→更换晶振→MCU配置。负载电容需按公式计算匹配,示波器观察是核心测试手段。

jiujiujinyuxi的博客 924

JS深度揭秘第一章-数据类型深入

1、重新认识JS2、数据类型简介3、Number、String方法转对象的原理、算法4、隐式类型转换出现的场景、规则,转数字的原理、转字符串的原理、5、递增与递减运算符的详细介绍及区别6、不同数据类型大小比较的原理、转换规则7、逻辑运算符的特殊用法8、逗号运算符的原理及应用9、for...of语句

使用单调栈求解最大矩形面积问题的C++实现

通过本文的介绍,我们详细讲解了如何使用单调栈求解砖墙中最大矩形面积的问题,并提供了完整的C++代码实现。希望通过本文的学习,你能掌握单调栈的基本概念及其在实际问题中的应用。如果你有任何疑问或建议,欢迎在评论区留言交流。

m0_57781768的博客 813

原生函数----《你不知道的js》

原生函数可以被当做构造函数来使用,但通过构造函数创建出来的是封装了基本类型的封装对象 var a = new String("abc"); typeof a; // "object" a instanceof String; // true Obejct.prototype.toString.call(a); // "[object String]" 复制代码可以这样来查看封装对象: consol...

weixin_33708432的博客 174

IAR调试CC1310的错误:Fatal error:Failed to connect to the XDS emlulator (Error -241 @ 0x0:)

从simplelink_cc13x0_sdk_2_10_00_36导入collector工程后,rebuild后进行debug,出现了如图错误:Fatal error:Failed to connect to the XDS emlulator (connect ICEPick)...(Error -241 @ 0x0)A router subpath could not be accessed....

qq_40417648的博客 6228

webrtc获取IceCandidate流程

foundation:用于唯一标识候选者的基础信息,通常是基于候选者的类型、IP地址、协议和replay协议计算出的字符串。component:标识候选者所属的传输组件。对于RTP流,通常使用1;对于RTCP流,通常使用2。protocol:候选者使用的传输协议,通常是UDP,但也可以是TCP(尽管在WebRTC中UDP更为常见)。priority:候选者的优先级,用于在选择最佳候选对时进行比较。优先级的计算公式考虑了候选类型优先级、本地优先级和组件ID。address:候选者的IP地址。port。

qq_42805085的博客 1901

JavaScript的数据类型、类型检测、类型转换

JavaScript的数据类型 原始数据类型:Undefined、Null、Boolean、Number、String、Symbol(ES6) 引用数据类型:Object 检测值的数据类型 typeof 显示类型转换 转换为数值 【方法一】Number(),用于任何数据类型,返回值是 数和NaN Number()函数转换规则总结 值是布尔值——true转换为1,false转换为0 值是null——0 值是undefined——NaN 值是字符串——空串、只带空格的字符串是0,有非数值就是NaN 【理

danni_he的博客 286

保姆级教程:用微信小程序+OneNet MQTT API,5分钟搞定温湿度数据实时展示

本文提供了一份详细的教程,教你如何利用微信小程序和OneNet MQTT API在5分钟内实现温湿度数据的实时展示。从OneNet平台配置到小程序数据绑定,手把手指导零基础开发者快速搭建监控系统,涵盖API调用、数据解析和界面设计等关键步骤。

weixin_30298497的博客 368

深入理解JS的类型、值、类型转换

一、七种内置类型和常见引用类型插个图,来自于《JavaScript语言精髓与编程实践》第三章P184页,后来想想有点多而杂,所以就自己画了些重点内容如上图二、特殊的null用typeof来检查上述七种类型时,返回的是对应的类型字符串值但,有一个例外typeof null === 'ogject' // true 复制代码null是唯一一个用typeof检测会返回'object'的基本类型值(注...

weixin_33681778的博客 266

第55篇:数据隐私保护技术盘点——差分隐私、同态加密与它们的坑(踩坑总结)

数据隐私保护是AI工程化中必须严肃对待的课题。差分隐私和同态加密是两把利器,但也都是“重武器”,使用不当反而会伤及自身。差分隐私像“模糊处理”,通过加噪来保证统计安全性,要小心管理隐私预算和效用权衡。同态加密像“保险箱里打算盘”,保证了计算的精确性,但必须承受巨大的性能和工程复杂度代价。我的建议是:从小规模实验开始,先用DP-SGD在MNIST/CIFAR-10等标准数据集上感受噪声与精度的关系;再用TenSEAL等易用的库尝试一个加密逻辑回归,体会密文膨胀和速度延迟。

ai_blue_pm的博客 281

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1694

SQL私教:基于AST与执行计划的语义级实时诊断工具

SQL不是语法填空题,而是需兼顾逻辑正确性、执行效率与业务意图的数据查询语言。理解SELECT执行顺序、GROUP BY语义约束、WHERE与HAVING差异等基础原理,是避免生产事故的前提;而真正决定SQL健壮性的,是执行计划特征(如索引使用、临时表生成)与抽象语法树(AST)所揭示的查询结构。本工具通过三层反馈引擎——语法合规检查、语义等价建模(融合逻辑操作流+谓词抽象树+执行计划指纹)、业务意图驱动的重构建议——实现从‘能跑通’到‘可上线’的跃迁,适用于数据分析师、业务方及资深工程师的日常SQL训练与

weixin_34166472的博客 377

96.在 Vue 3 中使用 OpenLayers 探究加载 Point、Polygon 的极限

在前端 GIS(地理信息系统)开发中,OpenLayers 作为一个功能强大的 Web 地图库,广泛用于加载地图、渲染矢量数据(点、线、面)、叠加图层等场景。然而,当涉及到。

小彭的博客 1154

Maker.js深度解析:如何用JavaScript构建专业级激光切割设计系统

在CNC加工和激光切割领域,设计师们常常面临一个技术痛点:传统CAD软件虽然功能强大,但学习曲线陡峭,且难以实现设计自动化。当需要批量生成参数化设计或集成到Web应用中时,这些软件显得笨重且不够灵活。Maker.js正是为解决这一痛点而生的JavaScript库,它让2D矢量绘图和形状建模变得像编写代码一样简单直观。 Maker.js是一个专为CNC和激光切割设计的JavaScript库,提供完

gitblog_01197的博客 755

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

开源工具super-plan-mode:连接Todoist、Notion等工具,构建统一智能计划

在软件工程和效率工具领域,数据同步与系统集成是提升工作流自动化的关键技术。其核心原理在于通过API桥接与统一数据模型,将异构系统的信息流打通,实现状态一致与智能联动。这项技术的价值在于打破信息孤岛,减少上下文切换,为复杂项目管理提供全局视图。典型的应用场景包括个人知识管理、跨平台任务协同以及自动化办公。本文聚焦的 super-plan-mode 项目,正是这一理念的实践,它作为“连接器”而非“重建者”,通过微服务化架构和智能计划引擎,将Todoist、Notion、Google Calendar等流行工具无

weixin_30856725的博客 576

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Watchman Node.js 客户端(fb-watchman)完整实战指南:安装、能力检测、watch-project 与实时订阅

本文以 Watchman 官方文档 [nodejs.md](https://link.gitcode.com/i/aefb53f93d7115b0231427c7645d5ab4) 为核心,系统讲解如何通过 npm 包 `fb-watchman` 在 Node.js 应用中接入 Watchman 文件监控服务。你将掌握客户端的安装与初始化、能力(capability)检测、`watch-proje

gitblog_00210的博客 188

5分钟掌握ESTree核心概念:JavaScript AST解析的终极指南 [特殊字符]

ESTree规范是JavaScript抽象语法树(AST)的行业标准,它为JavaScript代码解析和转换提供了统一的接口格式。无论你是前端开发者、工具库作者还是代码分析爱好者,理解ESTree都是掌握现代JavaScript生态的关键一步。 ## 🔍 什么是ESTree? ESTree是JavaScript AST的通用规范格式,起源于Mozilla的SpiderMonkey引擎。它定义

gitblog_00634的博客 417

CoffeeScriptRedux完全指南:如何构建更稳健的JavaScript编译器

CoffeeScriptRedux是一个基于现代编译器设计原则重写的CoffeeScript编译器,专注于提升稳健性和可扩展性。作为GitHub加速计划的一部分,它为开发者提供了更可靠的CoffeeScript到JavaScript的转换解决方案,特别适合需要处理复杂代码转换的项目。 ## 🚀 为什么选择CoffeeScriptRedux? ### 核心优势解析 CoffeeScriptR

gitblog_00894的博客 945

dsh-purge 上手前指南:它改写的 52 个官方文件、三层自制备份与四条退出路径

dsh-purge 是装在本机官方 DeepSeek Harness 上的红队评测插件,名字叫 purge,但它不删任何东西——点「应用」后,52 条补丁会直接改写本机 `@deepseek-ai` 官方包里的渲染文案、审批策略与执行逻辑。本文替你在动手前回答三个问题:它实际会写哪些文件、写坏了坏成什么样、翻车后从哪条路退出来。看完你可以判断:自己这台机器上,值不值得点那个「应用」。 ## 先看

gitblog_00777的博客 1009

Valdi 中的 QuickJS:跨平台 UI 框架的 JavaScript 引擎定制与实践

QuickJS 是 Valdi 在 Android/iOS/桌面等多端共用的 JavaScript 引擎后端之一,本文基于仓库中 QuickJS 第三方依赖的完整演进记录与源码实现,梳理该引擎的 fork 基线、Valdi 专属 API 定制、Bazel 构建集成,以及它在 [IJavaScriptContext](https://link.gitcode.com/i/212bc2a9d08f3c

gitblog_00805的博客 445

JPlag代码抄袭检测工具:守护原创性的智能卫士

在当今数字化教育时代,**代码抄袭检测**已成为维护学术诚信的关键技术。JPlag作为一款开源的**软件抄袭检测**工具,通过基于令牌的智能分析,能够准确识别代码中的相似之处,有效防范抄袭行为。这款强大的工具支持多种编程语言,为教育工作者和软件开发团队提供了可靠的原创性保护方案。 ## 🔍 JPlag核心功能特性 ### 智能代码相似度分析 JPlag采用先进的**令牌序列匹配**技术,将源

gitblog_00487的博客 772

基于C#的个人学习计划管理系统-计算机毕设 【课程设计】 05178

学生用户: (1)首页:提供链接到学习资源、课程活动、个人首页等功能的入口。 (2)通知公告:显示所有公告的标题、发布时间等信息。 (3)学习资源:显示可用学习资源的标题、类型(文档、视频等)、上传者等信息。:根据不同学科或类型对资源进行分类。 (4)课程活动:显示所有在进行或即将进行的课程活动。:可点击查看活动的详细信息,包括时间、地点、内容等。 (5)个人首页:展示用户的基本信息(姓名、学号、专业等)。 (6)资源学习:记录已学习和正在学习的资源进度。学习笔记:提供功能让学生为学习过的资源添加笔记。 (

WeiXin_DZbishe的博客 1750

数字孪生与智慧检测实训平台:建筑门窗三性教学实践

数字孪生技术通过创建物理实体的虚拟映射,实现了对复杂系统运行状态的实时监控与模拟。其核心原理在于利用物联网传感器采集数据,驱动三维模型同步变化,从而打破信息孤岛,实现虚实交互。在工程教育领域,该技术的价值尤为凸显,它能将抽象的理论知识转化为直观、可交互的视觉体验,有效解决传统实训中设备昂贵、过程不可见、原理难理解的痛点。特别是在建筑门窗气密性、水密性、抗风压等物理性能检测教学中,智慧检测平台结合数字孪生,能够将空气流动、压力分布、结构形变等不可见过程实时可视化。学生通过操作虚拟平台,不仅能模拟标准检测流程,

weixin_34405354的博客 279

arcgis api for javascript 比例尺改变颜色_[译] 2020 十大 JavaScript 图像处理库

原文地址:10 JavaScript Image Manipulation Libraries for 2020原文作者:Mahdhi Rezvi译文出自:掘金翻译计划本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO1/image-manipulation-libraries-for-javascript.md译者:IAMSHEN...

weixin_30986285的博客 389

JavaScript高手成长路径:执行深度、认知宽度与反馈速度

JavaScript作为前端核心语言,其能力本质远超语法记忆——它要求开发者构建可推演的运行时心智模型(如this绑定、事件循环微任务机制),建立横跨浏览器/V8/Node.js的技术栈坐标系,并将调试升维为‘假设-验证’的实验科学。真正的进阶不靠碎片化学习,而在于对ECMAScript规范、V8引擎实现与真实生产问题的三层穿透。本文围绕执行深度、认知宽度、反馈速度三大关键词,系统拆解从语法搬运工到架构决策者的四阶跃迁路径,覆盖反向工程标准库、手写最小可行架构、开源负向贡献及技术债清算等硬核实践,直击中高级

weixin_40192258的博客 668

Amper:下一代JavaScript工具链如何解决前端配置与维护难题

在现代前端开发中,构建工具链的配置与维护是开发者面临的核心挑战之一。从Webpack到Vite,再到Turbopack,工具生态的快速演进带来了性能提升,但也伴随着日益复杂的配置和升级成本。其原理在于,每个工具都有其独特的配置体系和插件生态,导致项目在长期维护中容易产生“配置地狱”,牵一发而动全身。这种碎片化状态不仅影响开发效率,也增加了团队的技术债务。Amper作为一种新型JavaScript工具链,其技术价值在于提供了一个统一的抽象层,旨在将开发者从底层工具的细节中解放出来。它通过声明式配置和适配器机制

weixin_34194087的博客 470
上一篇: 深入javascript计划一:数据类型深入介绍
下一篇: 深入javascript计划三:javascript编译器、引擎、作用域介绍
An_s
博客等级 码龄10年 665粉丝 363原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

An_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值