Javascript указатель на массив

Указатели в JavaScript?

Можно утверждать, что это плохой стиль, так как вы собираетесь использовать побочные эффекты функции, чтобы вызвать мутацию. Это может усложнить выполнение вашего кода.

14 ответов

Так как JavaScript не поддерживает передачу параметров по ссылке, вам нужно сделать вместо этого переменную:

var x = ; function a(obj) < obj.Value++; >a(x); document.write(x.Value); //Here i want to have 1 instead of 0

В этом случае x является ссылкой на объект. Когда x передается функции a , эта ссылка копируется на obj . Таким образом, obj и x относятся к одной и той же вещи в памяти. Изменение свойства Value obj влияет на свойство Value x .

Javascript всегда будет передавать функциональные параметры по значению. Это просто спецификация языка. Вы можете создать x в локальной области видимости для обеих функций, а не передавать переменную вообще.

Есть ли способ сделать это так, что другой человек просто сделает: var x = 0; a (x); и что функция устанавливает объект со значением х? (или что-то типа того)

Эй, спасибо, что познакомил меня с фрагментами кода на SO . Я не слышал о них до того, как увидел, что это использовалось в вашем ответе.

Что если вы не знаете имя свойства obj, например, если оно было obj.name, тогда в следующий раз вы захотите обновить obj.surname? Как вы можете заставить функцию адаптироваться к такой гибкости?

@Dave Дейв это может быть поздний ответ, но вы можете заставить свою функцию ожидать 3 параметра, объект, имя свойства и значение. Помните, что вы можете получить доступ к свойству объекта, выполнив obj.propertyname или obj [‘propertyname’], который будет таким, каким вы хотите, когда вам нужна гибкость. Передайте 3 параметра и выполните obj [‘propertyname’] = значение, и это будет многократно использоваться.

«Поскольку JavaScript не поддерживает передачу параметров по ссылке, вам нужно вместо этого сделать переменную объектом». Я думаю, что более правильно сказать, что, поскольку JavaScript не дает вам контроля над тем, какие значения передаются по ссылке, вы можете злоупотреблять его несогласованностью, заключая переменную в объект, который всегда передается по ссылке.

Подводя итог, примитивные типы Javascript всегда передаются по значению, тогда как значения внутри объектов передаются по ссылке (спасибо комментаторам за указание моего контроля). Итак, чтобы обойти это, вы должны поместить свое целое внутри объекта:

var myobj = ; function a(obj) < obj.x++; >a(myobj); alert(myobj.x); // returns 1 

Переменные объекта всегда также передаются по значению — просто значение является ссылкой на объект. Существует разница между передачей по ссылке и передачей ссылки по значению . А именно, когда вы передаете x по значению, независимо от того, является ли x объектом или нет, вы не можете заменить его другим значением, каким бы оно ни было.

Читайте также:  Unix time milliseconds python

тогда как объекты передаются по ссылке просто не соответствует действительности. Ничто в JavaScript не передается по ссылке.

Если вы передаете тип примата по значению (на него ссылается x), почему x не изменяется после, если вы не передадите объект

Я нашел несколько другой способ указателей на реализацию, который, возможно, более общий и понятный с точки зрения C (и, таким образом, больше подходит для формата примера пользователей).

В JavaScript, как и в C, переменные массива на самом деле просто указывают на массив, поэтому вы можете использовать массив точно так же, как объявление указателя. Таким образом, все указатели в вашем коде могут использоваться одинаково, несмотря на то, что вы назвали переменную в исходном объекте.

Он также позволяет использовать две разные обозначения, ссылающиеся на адрес указателя и то, что находится по адресу указателя.

Вот пример (я использую знак подчеркивания для обозначения указателя):

var _x = [ 10 ]; function foo(_a) < _a[0] += 10; >foo(_x); console.log(_x[0]); 

Вы ссылаетесь на «x» из окна объекта

var x = 0; function a(key, ref) < ref = ref || window; // object reference - default window refJavascript указатель на массив++; >a('x'); // string alert(x); 

Поздний ответ, но я столкнулся с методом передачи примитивных значений посредством ссылки посредством закрытия. Сложно создать указатель, но он работает.

function ptr(get, set) < return < get: get, set: set >; > function helloWorld(namePtr) < console.log(namePtr.get()); namePtr.set('jack'); console.log(namePtr.get()) >var myName = 'joe'; var myNamePtr = ptr( function () < return myName; >, function (value) < myName = value; >); helloWorld(myNamePtr); // joe, jack console.log(myName); // jack 

В ES6 код можно сократить, чтобы использовать лямбда-выражения:

var myName = 'joe'; var myNamePtr = ptr(=> myName, v => myName = v); helloWorld(myNamePtr); // joe, jack console.log(myName); // jack 

Это может быть невозможно, поскольку JavaScript не имеет Perl «\» для получения примитива по ссылке, но есть способ создать объект «эффективно указатель» для примитива, используя этот шаблон.

Это решение имеет наибольший смысл, когда у вас уже есть примитив (поэтому вы не можете помещать его в объект больше, без необходимости изменять другой код), но все равно нужно передать указатель на него для других частей вашего код для возиться со своим состоянием; поэтому вы все равно можете возиться со своим состоянием, используя простой прокси-сервер, который ведет себя как указатель.

var proxyContainer = <>; // | attaches a pointer-lookalike getter/setter pair // | to the container object. var connect = function(container) < // | primitive, can't create a reference to it anymore var cant_touch_this = 1337; // | we know where to bind our accessor/mutator // | so we can bind the pair to effectively behave // | like a pointer in most common use cases. Object.defineProperty(container, 'cant_touch_this', < 'get': function() < return cant_touch_this; >, 'set': function(val) < cant_touch_this = val; >>); >; // | not quite direct, but still "touchable" var f = function(x) < x.cant_touch_this += 1; >; connect(proxyContainer); // | looks like we're just getting cant_touch_this // | but we're actually calling the accessor. console.log(proxyContainer.cant_touch_this); // | looks like we're touching cant_touch_this // | but we're actually calling the mutator. proxyContainer.cant_touch_this = 90; // | looks like we touched cant_touch_this // | but we actually called a mutator which touched it for us. console.log(proxyContainer.cant_touch_this); f(proxyContainer); // | we kinda did it! :) console.log(proxyContainer.cant_touch_this); 

Javascript должен просто поместить указатели в микс, потому что он решает много проблем. Это означает, что код может ссылаться на неизвестное имя переменной или переменные, которые были созданы динамически. Он также упрощает модульное кодирование и инъекцию.

Читайте также:  Viewport device width javascript

Это то, что я вижу как самое близкое к тому, что вы можете сделать с помощью указателей на практике

var a = 78; // creates a var with integer value of 78 var pointer = 'a' // note it is a string representation of the var name eval (pointer + ' = 12'); // equivalent to: eval ('a = 12'); but changes value of a to 12 
int a = 78; // creates a var with integer value of 78 int pointer = &a; // makes pointer to refer to the same address mem as a *pointer = 12; // changes the value of a to 12 

Источник

Pointers in JavaScript

Pointers in JavaScript

The following article provides an outline on Pointers in JavaScript. In JavaScript, most of the things are Objects whether we consider arrays, functions etc, hence it is considered as an Object-Oriented Language. The only elements that are not objects are the primitive data types. Primitive data types are immutable, and objects are mutable elements.

Web development, programming languages, Software testing & others

What are pointers?

A pointer is a variable through which we can access another variable’s value.

The below diagram depicts how pointers work in a C Programming Language.

Pointers

References in JavaScript

  • An important thing to note is that pointers are commonly used to implement call-by-reference.
  • But we know that JavaScript does not support passing parameters by reference.
  • How to implement the call-by-reference feature in JavaScript?
  • The solution to this problem is to make a variable into an objector object literal.

Examples of Pointers in JavaScript

Given below are the examples:

Example #1

Creating an Object Literal.

      

pointers in javascript 1

Explanation:

  • In the above example, objRef is a reference to an object.
  • When objRef is passed to the function pointer, that reference is copied over to obj. Thus,obj and objRef refer to the same thing in memory.
  • Changing the numproperty of obj affects thenum property ofobjRef.
Читайте также:  File objects in javascript

Example #2

   

Refernces in JavaScript

pointers in javascript 2

pointers in javascript 3

Explanation:

The above output is seen when we change the below line:

from:document.getElementById("references").innerHTML = sport;
to: document.getElementById("references").innerHTML = sport.outdoor;

i.e. we access the sportobject value.

Also, when we assign a variable, like the one below:

new Object() is an OBJECT, and the variable object is a pointer or a reference (more suitable term in the JavaScript World). So, from now onwards in this blog, we will call “pointers”, references.

Example #3

      

creating an object

Explanation:

  • Anything in JavaScript that’s not a primitive value is automatically an object. A primitive value is one of boolean, number, string, null, and undefined. Primitives are implicitly promoted to an object if you try to access a property on them, like in Example 2 below. Also, regex literals create a regex object. Just as the object literal and array literal do.
  • During coding when we use as assignment operator “=” along with a primitive data type variable, it creates a copy of the original variable whereas objects creates references, therefore when we change a value in new created reference it reflects in the original object variable.
  • When we use “=” operator with objects, it creates an alias to the original object, and does not create a new object. That’s what “by reference” means.

Example #4

      

shared value

Explanation:

  • In the above example, we are declaring array variables that point to the same value i.e. shared value.
  • When one of the variables is modified the other variable will have that modified value.

Example #5

Reassignment of References.

      lt;/html>

Reassignment of Refences.

Explanation:

Conclusion

In conclusion, JavaScript primitive types are always passed by value, whereas the values inside objects are passed by reference. It is important to understand references in JavaScript which can help developers to avoid common mistakes and write better executional scripts. Point to remember is that the references in JavaScript only point at contained values and not at other variables, or references.

This is a guide to Pointers in JavaScript. Here we discuss the introduction, references in JavaScript and examples. You may also have a look at the following articles to learn more –

89+ Hours of HD Videos
13 Courses
3 Mock Tests & Quizzes
Verifiable Certificate of Completion
Lifetime Access
4.5

97+ Hours of HD Videos
15 Courses
12 Mock Tests & Quizzes
Verifiable Certificate of Completion
Lifetime Access
4.5

JAVASCRIPT Course Bundle — 83 Courses in 1 | 18 Mock Tests
343+ Hours of HD Videos
83 Courses
18 Mock Tests & Quizzes
Verifiable Certificate of Completion
Lifetime Access
4.5

Источник

Оцените статью